C# 多态性和方法继承

标签 c# polymorphism

考虑以下类:

public class X {};
public class Y : X {};
public class Z : X {};

public class A {
    public bool foo (X bar) { 
        return false;
    }
};

public class B : A { 
    public bool foo (Y bar) { 
       return true;
    }
};    

public class C : A { 
    public bool foo (Z bar) { 
       return true;
    }
};

有没有办法实现下面的期望输出?

A obj1 = new B();
A obj2 = new C();

obj1.foo(new Y()); // This should run class B's implementation and return true
obj1.foo(new Z()); // This should default to class A's implementation and return false

obj2.foo(new Y()); // This should default to class A's implementation and return false
obj2.foo(new Z()); // This should run class C's implementation and return true

我遇到的问题是,无论传递的参数如何,A 类的实现总是被调用。

最佳答案

您需要在 A 类中创建 foo 方法 virtual 以便它可以被正确覆盖并以多态方式调用。

public class A { public virtual bool Foo (X bar) { ... } }
public class B { public override bool Foo (X bar) { ... } }

你目前的做法是在 BC 中有效地定义一个新的方法实现,只有当实例属于该类型时才会被调用.由于您将它们声明为类型 A (A obj1 = new B();) 并且该方法不是虚拟的,因此 A 实现将总是被调用。

关于C# 多态性和方法继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30298903/

相关文章:

c++ - 什么是编译时多态性,为什么它只适用于函数?

c# - 无法找到名称为 Pomelo.EntityFrameworkCore.MySql 的提供程序集

c# - 套接字同步发送优于异步开始发送/结束发送吗?

c# - 如何实例化运行时确定的一定数量的对象?

c# - 如何判断一个点在立方体内部还是外部?

java - 从 MyAbstractParameter 转换为 T 时未检查的转换警告

c# - 如何使用 C# 检索特定的 XML 标签值

c# - 基于变量值的动态方法调度

c++ - 面向对象 : How to Choose from a Number of Implementations

以封装、多态和继承为特色的 Java 示例?