c# - 当我一直调用基类方法时如何调用我的具体类方法

标签 c# .net inheritance

给定这些类:

public abstract class Car
{
    public void Copy(Car car)
    {
        // stuff //
    }
}

public class Ford : Car
{
    public void Copy(Ford updatedFord) 
    {
        base.Copy(updatedFord);
        // copy ford stuff //
    }
}

public class Holden  : Car
{
    public void Copy(Holden updatedHolden) { .. }
}

这就是我想要做的...

public void TestMethod()
{
    Car car1 = new Ford { Colour = "Red", StickerCount = 1 };
    Car car2 = new Ford { Colour = "Blue", StickerCount = 666 };

    car1.Copy(car2);
    // I expect blue AND 666 to be copied. only Blue is.
}

Here's all the code in a .NET FIDDLE .

所以在这种情况下,如果汽车是 Ford 实例,那么 Ford 类上的 Copy(..) 方法,被称为 .. 而不是 Car 实例上的复制方法。

我只是不确定如何在最具体的类上调用 Copy 方法(然后通过继承的层次结构调用 base.XXX()

最佳答案

那是因为 Ford.Copy未在基类上声明,因此在您转换 Ford 后不可访问到 Car .

Ford.Copy需要覆盖 Car.Copy .

但是由于它的参数有不同的类型,它不能只覆盖基方法。

你需要的是参数化Car - Car<TCar> - 然后使用该类型参数来定义您的参数类型。然后每个子类将指定他们将复制的汽车类型。

这叫做 F-bound polymorphism .

public abstract class Car<TCar> where TCar : Car<TCar>
{
    public virtual void Copy(TCar car)
    {
        // stuff //
    }
}


public class Ford : Car<Ford>
{
    public override void Copy(Ford updatedFord) {}
}

public class Holden  : Car<Holden>
{
    public override void Copy(Holden updatedHolden) { .. }
}

关于c# - 当我一直调用基类方法时如何调用我的具体类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32112563/

相关文章:

c# - 如何将 System.IO.Packaging.Package 转换为 HTML?

C# IE11 selenium webdriver,新选项卡没有新窗口句柄

c# - 关闭已编程的应用程序后,系统句柄仍然存在。文件无法访问

c# - 继续运行特定数量的任务

php - SilverStripe 通过 DataExtension 检索原始类名

c# - 单元/集成测试和恢复数据库

javascript - 将字符串从 .NET 传递到 JavaScript 变量

.net - RabbitMQ、.NET 和多线程

c++ - 如何在单个声明中设置继承的 C++ 类/结构变量

javascript - 使用 Object.create() 模拟经典继承