Есть ли способ определить абстрактный тип как параметр в абстрактном методе, а когда этот метод реализован в производном классе, вы измените тип метода для принятия производного тип?Изменение типа параметра при реализации абстрактного метода
Код:
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
}
}
В моей голове, это делает какой-то смысл. Абстрактный класс, указывающий на то, что существует метод, который производные классы должны реализовывать, но они могут изменять тип объекта, переданного в качестве параметра, при условии, что он принадлежит к одной цепочке наследования ...
Что я в итоге do, заключается в том, чтобы удалить абстрактный метод AddProduct
из абстрактного класса, а вместо этого просто реализовать его в производном классе в любом случае, но в будущем нет контрактов для других классов, которые они должны создать свою собственную реализацию AddProduct
. И это не чувствовать себя правильно.
Надеюсь, это имеет смысл. Извините, если это дублированный вопрос, но я не смог найти ничего, выполнив поиск.
Спасибо,
bgs264
Только то, что я искал, спасибо: D – bgs264
@ bgs264 примечание: одна большая проблема с этим что вы теряете абстракцию «A». Например, вы не можете использовать «Список » или «A a = SomeFactoryMethod();' –
@ bgs264: при выполнении этого, убедитесь, что вы действительно хотите/нуждаетесь в абстрактном классе. Вы не можете называть 'addProduct' в любом случае, не указав теперь' TProduct', даже если вы просто хотите иметь переменную типа 'A'. ср замечания в моем решении по этому вопросу. –