我的扩展课程有问题。
这是课程:
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);
有更好的选择吗?
答案 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();