C#:抽象类引用指向子类实例无法调用子类方法,问题出在哪?
问题原因与解决方案
你的问题出在变量声明类型和实际实例类型不匹配:
localClass被声明为抽象类A的类型,虽然你实际给它赋值了B的实例,但编译阶段编译器只会依据声明的A类型检查可访问成员。getOtherString()是子类B独有的方法,抽象类A中并未定义该方法,因此编译器不允许通过A类型的引用调用它。
解决办法
1. 类型转换调用
把A类型的引用转换成B类型后再调用方法:
// 直接强制转换 string test2 = ((B)localClass).getOtherString(); // 安全转换(推荐,避免类型不匹配时抛出异常) var bInstance = localClass as B; if (bInstance != null) { string test2 = bInstance.getOtherString(); }
2. 修改变量声明类型
如果localClass从始至终只会存储B的实例,直接将其类型改为B:
private B localClass; C() { localClass = new B(); string test1 = localClass.getString; // 依然可用,因为B继承自A string test2 = localClass.getOtherString(); // 直接调用成功 }
3. 在抽象类中定义抽象方法(按需使用)
如果getOtherString()是所有继承A的子类都应具备的功能,可以在A中添加抽象方法,让B实现:
public abstract class A { public abstract string getString { get; } public abstract string getOtherString(); // 添加抽象方法 } public class B: A { public override string getString { get => "String"; } public override string getOtherString() // 实现抽象方法 { return "oterString"; } }
这样通过A类型的引用也能直接调用getOtherString(),但如果该方法只是B独有,就没必要用这种方式。
内容的提问来源于stack exchange,提问作者eyelog
相关产品推荐
相关产品推荐

