将扩展类放在父类中

时间:2014-08-28 13:40:54

标签: java spring

我的扩展课程有问题。

这是课程:

class A{
}

class B extends A{
}

现在问题是我有一个返回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);

有更好的选择吗?

3 个答案:

答案 0 :(得分:3)

从根本上说,我认为你已经错过了赋值运算符的功能。这句话:

b = doSomething();

b的值更改为doSomething()方法返回的值。它完全不依赖于b 的现有值。所以类似地,当你有:

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

......写下来会更有意义:

A a = doSomething();

现在,如果您需要根据B的实例创建A的实例,那么编写它可能是有意义的:

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

或只是:

B b = new B(doSomething());

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

通常我发现当我需要做类似的事情时,最好还是使用合成而不是继承 - B应该引用现有的A而不是扩展A。这当然值得考虑,但没有具体的例子,我们无法肯定地说。

答案 1 :(得分:0)

您将对象b实例化为B类型,而不是A,因此调用polymorphism

doSomthing无效

将对象b更改为A类型

答案 2 :(得分:0)

Java没有多重继承(c# example)来强制执行方法签名。相反,

是有意义的
public static A doSomthing(){
   A result = new A();
   ...
   return result;
}

然后你可以使用:

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