Есть ли способ определить абстрактный тип как параметр в абстрактном методе, и когда этот метод реализуется в производном классе, вы меняете тип метода, чтобы принять производный тип?
Код:
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