c# - 为什么包含对 B 类型对象的引用的 A 类型引用变量不能访问 B 类的成员函数?

标签 c# class object inheritance c#-4.0

为什么 objA 无法访问 methodB(),因为它包含对类 B 类型的对象的引用?

Class A 
{
     public void methodA()
     {
           .........
     }
}

Class B:A
{
     public void methodB()
     {
          ..........
     }
}

现在

A obj1= new B();

这会引发错误:

obj1.methodB();

为什么? obj1 包含对 B 类型的对象的引用,但它仍然无法访问它的成员函数。

最佳答案

您声明了 A 类型的变量:

A obj1

并且 A 没有名为 methodB 的方法。如果您希望变量的类型为B,请按如下方式声明:

B obj1= new B();

(这当然意味着您不能在该变量中存储 A 的任何其他实现,只能存储 B。)

或者,如果您不想更改变量,则需要强制转换变量:

(obj1 as B).methodB();

(如果obj1曾经包含A的实现,而不是B,这当然会失败>.)

基本上,当您声明 A 类型的变量时,编译器会将其维护为 A 类型。在声明后的任何时候都不能保证该变量将包含 B 的实例。我可以包含实现 A任何东西的实例。

关于c# - 为什么包含对 B 类型对象的引用的 A 类型引用变量不能访问 B 类的成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47924409/

相关文章:

javascript 如何获取父类构造函数参数

c# - 如何 Hook 全局 WM_APPCOMMAND 消息?

c# - ReactiveUI WPF - 调用线程无法访问此对象,因为另一个线程拥有它

javascript - 为什么我无法访问在 ngOnInit 上设置的对象

javascript - 函数参数未正确添加到 JSON 对象

javascript - 运行 Object.keys 后对象键的顺序不同

ios - MPMoviePlayerController 隐藏音量 slider

c# - 从表中获取最大值,除非为空

c# - Windows CE 在窗体顶部显示不存在的面板

java - 在类层次结构中设置变量