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

bgs*_*264 5 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
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的脑海中,它有一些道理.一个抽象类,指示派生类必须实现的方法,但它们可以更改作为参数传入的对象的类型,只要它来自同一个继承链...

我最终做的是AddProduct从抽象类中删除抽象方法,而不是仅仅在派生类中实现它,但是将来没有其他类的合同,他们必须创建自己的实现AddProduct.它感觉不对.

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

谢谢,
bgs264

nem*_*esv 9

您可以将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)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)