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

C# 为什么持有类对象引用的接口类型变量不调用类成员函数?,c#,asp.net,oop,c#-4.0,interface,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()?这是因为您正在使用IPerson的引用创建M

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

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

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


根据继承方法的规则,只有子类中的才能通过父类的引用访问。

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


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

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

IPerson p = service.GetPerson();
编译器如何知道这个实例实际上是一个
或其他什么?进一步想象一下,还有另一个类实现了您的接口。你 看到问题了吗?编译器无法知道服务在运行时返回哪个类。这就是为什么您不能访问特定于实现类的成员。在
IPerson
上根本没有成员
GetAge
。事实上,任何基类或接口都不应该知道其子类的任何内容

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

Man p = new Man();

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

IPerson p = service.GetPerson();
编译器如何知道这个实例实际上是一个
或其他什么?进一步想象一下,还有另一个类实现了您的接口。你 看到问题了吗?编译器无法知道服务在运行时返回哪个类。这就是为什么您不能访问特定于实现类的成员。在
IPerson
上根本没有成员
GetAge
。事实上,任何基类或接口都不应该知道其子类的任何内容

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

Man p = new Man();

你能提供一份报告吗?您发布的代码甚至都不是有效的c#。您的问题不清楚,但我想您是在问为什么不能对p变量调用GetAge。。。因为IPerosn没有GetAge方法,您能提供一个吗?您发布的代码甚至都不是有效的c#。您的问题不清楚,但我想您是在问为什么不能对p变量调用GetAge。。。因为IPerosn没有GetAge方法,但它是一个浅拷贝,这意味着现在两者都指向相同的内存位置。那么,为什么不呢?是的,但引用是IPerson的,它不能访问仅属于Man类的方法。由于动态多态性,IPerson可以引用Man类的对象,但隐私规则禁止它访问Man类中唯一可用的方法,但这是一个浅拷贝,意味着现在两者都指向相同的内存位置。那么,为什么不呢?是的,但引用是IPerson的,它不能访问仅属于Man类的方法。由于动态多态性,IPerson可以引用Man类的对象,但隐私规则禁止它访问Man类中唯一可用的方法