C # Переопределение абстрактных методов (включая входные параметры)

#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.

http://en.wikipedia.org/wiki/Builder_pattern