问各位童鞋们一个比较菜的问题,关于继承的

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() 
  }

}

或者你可参考这个 java父类强制转换为子类_Undefined-CSDN博客_java父类强制转换成子类 许多同学在学习到Java的继承时,遇到了父类和子类互相转化的问题,在此通俗的讲一下。示例一父类强制转子类Father f = new Father();Son s = (Father)f;//出错 ClassCastException分析:创建一个父类的实例,想要强制把父类转换成子类,不行!通俗的想,真正当爹的永远不可能装儿子。示例二“假的”父类强制转子类Father f = ... https://blog.csdn.net/u014418267/article/details/103545074

不能这么干。
对于下面的语句,
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

  1. 把C类中的方法改成生成A类,然后就可以用A类的方法了
  2. 继承关系反过来,B类继承A类,让A类作为父类,然后B类就可以直接使用A类中的方法了