Изменить тип параметра при реализации абстрактного метода

Есть ли способ определить абстрактный тип как параметр в абстрактном методе, и когда этот метод реализуется в производном классе, вы меняете тип метода, чтобы принять производный тип?

Код:

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из абстрактного класса и вместо этого просто реализовать его в производном классе в любом случае, но тогда нет контракта для других классов в будущем, что они должны создавать свою собственную реализацию ДобавитьПродукт. И это кажется неправильным.

Надеюсь, это имеет смысл. Извините, если это дублирующийся вопрос, но я ничего не нашел поиском.

Спасибо,
bgs264

5
задан bgs264 13 June 2012 в 12:54
поделиться