#c# #class #interface #abstract-class
#c# #класс #интерфейс #абстрактный класс
Вопрос:
В C # возможно сделать что-то вроде этого
public absctract class ImportBase()
{
public abstract void CreateDocument();
}
public class UsingOne : ImportBase
{
public override bool CreateDocument(string name)
{
return null;
}
}
Я хочу иметь некоторый базовый класс, в котором есть только некоторые методы, но в производном классе мне нужно изменить входные параметры и внутри метода.
Ответ №1:
Вы не переопределяете метод. Смысл наличия абстрактного (или виртуального) метода заключается в том, что при наличии любого ImportBase
я должен иметь возможность вызывать
importBase.CreateDocument();
Это явно не относится к UsingOne
, поскольку для этого требуется больше информации. Итак, вы действительно пытаетесь привязать своего вызывающего абонента к UsingOne
, а не только ImportBase
— в этот момент вы потеряли преимущества полиморфизма.
Чтобы переопределить метод, реализация должна иметь, в основном, ту же сигнатуру.
Комментарии:
1. Я понимаю. Найдите способ иметь только предписанные методы, а производный класс сообщает, какие методы нужны и что возвращает
Ответ №2:
Вероятно, вы хотите свести к минимуму дублирующийся код в ваших производных классах. В принципе, невозможно переопределить другую сигнатуру, но, безусловно, вы можете провести рефакторинг своего кода, где вы сможете сохранить возможный дублирующий код в базовом классе и использовать его в своих производных классах.
public absctract class ImportBase()
{
//Making this protected here
protected virtual void CreateDocument()
{
//Your CreateDocument code
};
}
public class UsingOne : ImportBase
{
private override void CreateDocument()
{
// Override this if you have different CreateDocument for your different
// for different derived class.
}
public bool CreateDocument(string name)
{
// Do whatever you need to do with name parameter.
base.CreateDocument();
// Do whatever you need to do with name parameter.
return true; // return false;
}
}
Вы можете создать экземпляр UsingOne
и вызвать CreateDocument(string name)
Комментарии:
1. Переопределение должно быть защищенным, а не частным.
Ответ №3:
нет. подпись должна быть одинаковой для производного класса. я предлагаю использовать шаблон builder.