【问题标题】:Why a variable of type interface holding class object reference is not calling a class member function?为什么持有类对象引用的接口类型变量不调用类成员函数?
【发布时间】:2018-11-12 11:53:07
【问题描述】:

为什么持有类对象引用的类型接口变量不调用类成员函数?

Public Interface IPerson 
{   
    void SetAge(int age);
}
Public class Man : IPerson
{
    Public void SetAge(int age ){}
    Public int GetAge(){return 20 ;}
}
Iperson p = new Man();

为什么 p 不调用 GetAge()?

【问题讨论】:

  • 你能提供一个minimal reproducible example吗?您发布的代码甚至不是有效的 c#。
  • 从你的问题中不清楚,但我想你在问为什么你不能在你的 p 变量上调用 GetAge ......因为 IPerosn 没有 GetAge 方法

标签: c# asp.net oop c#-4.0 interface


【解决方案1】:

这是因为您正在使用IPerson 的引用创建Man 的对象,而GetAge() 方法不属于IPerson 接口。

根据继承方法的规则存在于子类中,不能通过父类的引用访问。

【讨论】:

  • 但它是一个浅拷贝意味着现在两者都指向相同的内存位置。那么,为什么不呢?
  • 是的,但引用是 IPerson 的,它无权访问仅属于 Man 类的方法。由于动态多态性,IPerson 可以引用 Man 类的对象,但隐私规则禁止它访问仅在 Man 类中可用的方法
【解决方案2】:

您忘记提供您致电GetAge的位置。但无论如何,实际类型Man 是一个运行时信息,编译器无法使用它。想象一下,您会从 Web 服务中获得 IPerson 的实例

IPerson p = service.GetPerson();

编译器应该如何知道这个实例实际上是Man 或其他什么?进一步想象有另一个类实现了你的接口。你 看到问题了吗?编译器无法知道服务在运行时返回哪个类。这就是为什么您不能访问特定于实现类的成员的原因。 IPerson 上根本没有成员 GetAge。事实上,任何基类或-interface 都应该永远知道它的子类。

如果您在编译时知道确切的类型,您当然可以强制转换为该特定类型,或者只将您的变量定义为该类型:

Man p = new Man();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2013-03-01
    • 2012-05-25
    相关资源
    最近更新 更多