使用动态绑定时无法调用子类方法

时间:2018-02-04 15:47:38

标签: c#

在使用动态绑定创建该子类的对象之后,我一直在尝试调用子类方法。

例如两个班级

public class Parent 


public class Child : Parent 

private void someMethod()....

我使用动态绑定创建对象

Parent person;

person = new Child(); //dynamic binding

person.someMethod(); //Does not work???

为什么我不能调用这个方法?

2 个答案:

答案 0 :(得分:0)

动态绑定工作正常:

dynamic person = new Child();
person.someMethod();

将编译并运行得很好。当然,这在大多数情况下都是一个坏主意,你正在减少语言和编译器提供的所有类型安全性,但是有合理的用例。

你的情景:

Person person = new Child();
person.someMethod();

与动态绑定无关,这是旧的OO多态性。它不起作用的原因是因为PersonsomeMethod完全不了解。编译器在编译时解析调用,person.GetType()返回Child的事实在运行时中是事实。

答案 1 :(得分:0)

您似乎对两种范例感到困惑,并试图将它们同时放入代码中。

  1. 经典多态方法:

    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
    
  2. 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
    
  3. 所以,你的代码介于它们之间,显然让C#编译器感到困惑。