c# - 实现抽象方法时更改参数类型

标签 c# inheritance abstract-class

有没有什么方法可以将抽象类型定义为抽象方法中的参数,并且当该方法在派生类中实现时,您可以更改方法的类型以接受派生类型?

代码:

public abstract class ProductBase
{
}

public class SomeProduct
    : ProductBase
{

}

public abstract class A
{
    protected abstract void addProduct(ProductBase p);
}

// This works
public class B : A
{        
    protected override void addProduct(ProductBase p)
    {
        // Do some work
    }
}

// This is what I'd like to do
public class C : A
{
    // Compiler error here because I have accepted a SomeProduct and not a ProductBase
    protected override void addProduct(SomeProduct p)
    {
        // Do some work on the specialisation - I can use the SomeProduct directly
    }
}

在我的脑海里,它有某种意义。一个抽象类表示派生类必须实现一个方法,但是他们可以改变作为参数传入的对象的类型,只要它来自同一个继承链...

我最后做的是从抽象类中删除抽象方法AddProduct,而只是在派生类中实现它,但是这样就没有其他类的契约了 future 他们必须创建自己的 AddProduct 实现。而且它感觉不对

我希望这是有道理的。抱歉,如果这是一个重复的问题,但我无法通过搜索找到任何内容。

谢谢,
bgs264

最佳答案

您可以将您的 A 类设为泛型,并在您的 addProduct 方法中使用泛型参数:

public abstract class A<TProduct> where TProduct : ProductBase 
{
    protected abstract void addProduct(TProduct p);
}

public class B : A<ProductBase>
{        
    protected override void addProduct(ProductBase p)
    {
    }
}

public class C : A<SomeProduct>
{
    protected override void addProduct(SomeProduct p)
    {
    }
}

关于c# - 实现抽象方法时更改参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11015152/

相关文章:

c# - 有没有办法将 xml 转换为 json?

c# - 如何使用 jquery 将图像 ajax 发布到 C# web 方法

c++ - "class name"必须是以前定义的类或结构

iphone - self 和 super 的区别

c++ - 模板类继承

C# 覆盖抽象方法(包括输入参数)

java - 将多种数据类型作为参数传递给方法的接口(interface)是什么样的?

c# - SQLite 标量函数返回类型始终为字符串?

c# - 捕获 va_list 错误

java - java中的数字没有子类如何工作?