Klaus
Klaus

Reputation: 1191

java polymorphism creating a new subclass object using a superclass variable

I want to create a new instance depending on an object, where I have the super class variable. Is this somehow possible without implementing a getNew() function or without usage of an ugly if chain? In other words: How to implement the following newSubClass(..) function without using the getNew() function?

public abstract class SuperClass {
    abstract public SuperClass getNew();
}

public class SubClassA extends SuperClass {
    @Override
    public SuperClass getNew() {
        return new SubClassA();
    }
}

public class SubClassB extends SuperClass {
    @Override
    public SuperClass getNew() {
        return new SubClassB();
    }
}

private SuperClass newSubClass(SuperClass superClass) {
    return superClass.getNew(); 
}

Upvotes: 3

Views: 605

Answers (2)

Martin Meeser
Martin Meeser

Reputation: 2956

After having some time to think about and zv3dh's contribution I decided this second answer.

I'am getting now you want an new instance of an instance of a subclass' type of SuperClass without knowing the concrete sub-type at runtime.

For that you have "reflexion".

public abstract class A_SuperClass {
    public A_SuperClass createNewFromSubclassType(A_SuperClass toCreateNewFrom) {
        A_SuperClass result = null;
        if (toCreateNewFrom != null) {
            result = toCreateNewFrom.getClass().newInstance();    
        }
        // just an example, add try .. catch and further detailed checks
        return result;
    }
}

public class SubClassA extends A_SuperClass {

}

public class SubClassB extends A_SuperClass {

}

If you search for "java reflexion" you will get lots of results here on SO and on the web.

Upvotes: 1

Martin Meeser
Martin Meeser

Reputation: 2956

Have a look at the "FactoryMethod" design pattern.

It is exactly what you are looking for: It does encapsulate the "new" operator.

However your example makes me wonder:

  • Your getNew() reimplements what the constructor would do anyway

Try something like this:

public abstract class SuperClass {
    public SuperClass createSuperClass(object someParam) {
        if (someParem == a) return new SubClassA();
        if (someParem == b) return new SubClassB(); 
    }
}

public class SubClassA extends SuperClass {

}

public class SubClassB extends SuperClass {

}

As you see you need some IF at some place ...

Upvotes: 0

Related Questions