C # Переопределение абстрактных методов (включая входные параметры) - PullRequest
2 голосов
/ 11 ноября 2011

Это возможно в C # сделать что-то подобное

public absctract class ImportBase()
{
   public abstract void CreateDocument();
}
public class UsingOne : ImportBase
{
   public override bool CreateDocument(string name)
   {
      return null;
   }
}

Мне нужен базовый класс, в котором есть только несколько методов, но в производном классе мне нужно изменить входные параметры и метод внутри.

Ответы [ 3 ]

4 голосов
/ 11 ноября 2011

Вы не переопределяете метод.Смысл наличия абстрактного (или виртуального) метода в том, что при любом ImportBase я должен иметь возможность вызывать

importBase.CreateDocument();

Это явно , а не в случае с UsingOne,как это нужно больше информации.Таким образом, вы действительно пытаетесь привязать своего вызывающего к UsingOne, а не просто к ImportBase - в этот момент вы утратили преимущества полиморфизма.

Чтобы переопределить метод, реализация должна иметьта же подпись, в основном.

2 голосов
/ 11 ноября 2011

Возможно, вы хотите минимизировать повторяющийся код в производных классах . По сути, невозможно переопределить другую сигнатуру, но, несомненно, вы можете реорганизовать свой код, чтобы сохранить возможный дублирующий код в базовом классе и использовать его в своих производных классах.

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 голос
/ 11 ноября 2011

Нету. подпись должна быть одинаковой на производном классе. Я предлагаю использовать шаблон строителя.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...