2014-08-28 56 views
0

我有一个扩展类的问题。放入扩展类中父类

这是类:

class A{ 
} 

class B extends A{ 
} 

现在的问题是,我有一个返回的方法是这样的:

public A doSomthing(){ 
} 

现在我尝试做这样的事情:

public static void main(){ 
    B b = new B(); 
    b = doSomething(); 
} 

但它似乎没有工作。有什么办法可以解决这个问题吗?

我想到的唯一的事情是它有这样的事情:

class B extends A{ 
public B(A a){ 
    copy all the fields from A to B} 
} 

然后执行:

A a = new A(); 
a = doSomthing(); 
B b = new B(a); 

是否还有更好的选择吗?

+0

你能否解释一下什么'DoSomething的()'应该做的事?它看起来像你正在使用它[工厂方法](http://en.wikipedia.org/wiki/Factory_method_pattern)。 – 2014-08-28 16:12:25

回答

0

您实例化对象bB型的,而不是A因此呼吁doSomthing

更改对象b为类型A

+0

是的,但我不能做这样的事情: b.SomeMethodADontHave(); – etlsh 2014-08-28 13:49:39

+0

@ user3659858看看Jon Skeet关于使用Composition来代替继承的部分。 – gtgaxiola 2014-08-28 13:58:19

3

从根本上说,我认为你已经错过了polymorphism是行不通的什么赋值运算符的确如此。本声明:

b = doSomething(); 

改变的b对什么doSomething()方法返回的值。它不取决于所有的现有值b。所以同样,当你有:

A a = new A(); 
a = doSomthing(); 

...它会更有意义写:

A a = doSomething(); 

现在,如果你需要创建一个基于A实例的B一个实例,然后它很可能是有意义的写:

A a = doSomething(); 
B b = new B(a); 

或者只是:

B b = new B(doSomething()); 

...但您需要了解何时使用现有值以及何时不使用。

通常我发现,当我需要做这样的事情,它实际上是更好的使用比继承组成反正 - 这B应该有一个参考现有A而不是扩展A。这当然值得考虑,但没有一个具体的例子,我们不能肯定地说。

+0

我更喜欢我写的方式,在分配之前声明变量更方便,更安全。特别是如果你只是在内部执行任务,如果/尝试... – etlsh 2014-08-28 13:49:18

+0

+1继承的组合! – gtgaxiola 2014-08-28 13:57:20

0

Java没有多重继承(c# example)来执行方法签名。相反,它将使意义

public static A doSomthing(){ 
    A result = new A(); 
    ... 
    return result; 
} 

然后你可以使用:

A a = A.DoSomthing(); 
B b = (B)A.DoSomthing();