Двойное наследование и абстрактный метод

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

  TControlObject = abstract class
  ...
  public
    method Clone:TControlObject; virtual; abstract;
  end;

  TGateControl = class(TControlObject)
  ...
  public
  ...
  end;

  TAndControl = class(TGateControl)
  public
    method Clone:TControlObject; override;
  end;

Однако компилятор выдает ошибку, что класс TGateControl не обеспечивает реализацию метода клонирования. Поскольку TGateControl наследуется от TControlObject, а класс TAndControl наследуется от TGateControl, метод клонирования должен автоматически переопределяться для метода клонирования базового класса. Я прав?

Заранее спасибо,


person ThN    schedule 09.08.2012    source источник
comment
Должен ли TMakerObject в вашем коде быть TControlObject? Если нет, то почему вы предоставляете сигнатуру класса для TMakerObject?   -  person Ian Dallas    schedule 09.08.2012
comment
Да, ошибся. Вот что бывает, когда начинаешь постоянно копировать и вставлять LOL   -  person ThN    schedule 09.08.2012


Ответы (1)


У вас есть атрибут abstract в методе Clone в TControlObject. Это означает, что любой класс, непосредственно производный от TControlObject, должен предоставлять реализацию метода Clone (см. резюме MSDN). В результате TGateControl должен предоставить реализацию Clone. Если бы в TControlObject была конкретная реализация Clone, то да, ее не нужно было бы переопределять.

Итак, некоторые варианты:

  1. Либо удалите атрибут abstract на клоне.
  2. Добавьте реализацию Clone либо в TControlObject, либо в TGateControl.

И чтобы уточнить, эти методы никогда не «автоматически переопределяются». Производный класс может вызывать реализацию базового класса, но было бы неправильно говорить, что производный класс «автоматически переопределяет» реализацию базового класса.

person Ian Dallas    schedule 09.08.2012