在使用动态绑定创建该子类的对象之后,我一直在尝试调用子类方法。
例如两个班级
public class Parent
public class Child : Parent
private void someMethod()....
我使用动态绑定创建对象
Parent person;
person = new Child(); //dynamic binding
person.someMethod(); //Does not work???
为什么我不能调用这个方法?
答案 0 :(得分:0)
动态绑定工作正常:
dynamic person = new Child();
person.someMethod();
将编译并运行得很好。当然,这在大多数情况下都是一个坏主意,你正在减少语言和编译器提供的所有类型安全性,但是有合理的用例。
你的情景:
Person person = new Child();
person.someMethod();
与动态绑定无关,这是旧的OO多态性。它不起作用的原因是因为Person
对someMethod
完全不了解。编译器在编译时解析调用,person.GetType()
返回Child
的事实在运行时中是事实。
答案 1 :(得分:0)
您似乎对两种范例感到困惑,并试图将它们同时放入代码中。
经典多态方法:
public class Parent
{
protected virtual void someMethod() {}
}
public class Child: Parent
{
protected override someMethod() {}
}
...
Parent person = new Child();
person.someMethod(); // would cause compile-time error if someMethod is missed in Parent virtual table
C#动态代码
public class Parent {}
public class Child : Parent
{
private void someMethod() {}
}
...
dynamic person = new Child();
person.someMethod(); // would cause run-time error if someMethod is absent at Child
所以,你的代码介于它们之间,显然让C#编译器感到困惑。