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

时间:2018-11-12 11:53:07

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

IPerson p = service.GetPerson();

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

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

Man p = new Man();