A类继承了B类,C类中有个方法生成的是B类对象。我需要调用A类中的方法,该怎么写。(B强转成A,后调用方法报错,查了一下说没必要这么做) 请问我这怎么办啊,是逻辑错了还是真的没理解继承的含义。
我简单写下可能语法上面有点问题(写c#)的将就点看吧
public class B{
public string GetName(){
return 'B'
}
}
// c#里面 : 和java 好像是 extends 一样(可以这么理解)
public class A : B{
public void SayHello(){
Console.write('A');
}
}
public class C{
private readonly B b;
public C(){
//新建一个B类
b= new B();
//这时候如果你要调用b.SayHello() 方法是没法的
// 因为在B类中没有SayHello()这个方法,
// 然后如果你 var a = b as A 强行转换,
// 这时候代码编译是成功的,但在运行的时候强制转换是失败的,哪怕成功,a也是为空
// 因为只允许子类转父类,父类没法转子类
//一般做法是 b = new A();
//调用A类的方法,(A)b.SayHello()
}
}
不能这么干。
对于下面的语句,
A a = new B();
实际运行时都是用new 右边的实际类型,new左边的类型是编译时用的,和运行时基本上没太大关系。
所以只需要关心new 后面的类型,不需要关心new 左边的类型。
所以对于运行时来说,不存在向下转型。
所以C中的方法如果写的是new B(),的话, 这个对象则无法向下转成A,
所以C中的方法如果写的是new A(),的话, 这个对象则可以向上转成B。
A类继承了B类,那么B类就是A的父类对不对,你C类中的方法是生成B类对象(也就是父类),B类如何才能转换成A类呢?肯定报错了。
修改代码,2选1