为什么持有类对象引用的类型接口变量不调用类成员函数?
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()?
答案 0 :(得分:1)
这是因为您正在使用Man
的引用创建IPerson
的对象,并且GetAge()
方法不属于IPerson
的接口。
根据子类中仅仅存在的继承方法的规则,不能通过父类的引用来访问。
答案 1 :(得分:1)
您忘记提供您致电的地方GetAge
。但是无论如何,实际类型Man
是运行时信息,编译器无法使用。想象一下,您将从Web服务获得IPerson
的实例
IPerson p = service.GetPerson();
编译器应如何知道此实例实际上是Man
或其他实例?进一步想象一下,还有另一个实现您的接口的类。您
看到问题了吗?编译器无法知道服务在运行时返回的类 。这就是为什么您不能访问特定于实现类的成员的原因。 GetAge
上根本没有成员IPerson
。实际上,任何基类或-interface都从不知道其子类的任何信息。
如果您在编译时知道确切的类型,则可以将其强制转换为该特定类型,也可以只定义该类型的变量:
Man p = new Man();