После прочтения серии вопросов конструктора Яна Бойда ( 1 , 2 , 3 ], 4 ), я понимаю, что не совсем понимаю буквальное значение того, что скрыто.
Я знаю (поправьте меня, если я ошибаюсь) переопределить
единственная цель - иметь возможность иметь полиморфное поведение, чтобы во время выполнения можно было разрешить метод в зависимости от фактического типа экземпляра, а не от объявленного типа. Рассмотрим следующий код:
type
TBase = class
procedure Proc1; virtual;
procedure Proc2; virtual;
end;
TChild = class(TBase)
procedure Proc1; override;
procedure Proc2; // <- [DCC Warning]
end;
procedure TBase.Proc1;
begin
Writeln('Base.Proc1');
end;
procedure TBase.Proc2;
begin
Writeln('Base.Proc2');
end;
procedure TChild.Proc1;
begin
inherited Proc1;
Writeln('Child.Proc1');
end;
procedure TChild.Proc2;
begin
inherited Proc2;
Writeln('Child.Proc2');
end;
var
Base: TBase;
begin
Base := TChild.Create;
Base.Proc1;
Writeln;
Base.Proc2;
Base.Free;
Readln;
end.
Который выводит:
Base.Proc1
Child.Proc1
Base.Proc2
В предупреждении на TChild.Proc2
говорится, что это метод « скроет доступ к одноименному методу базы ». Что я вижу, если я не t override Proc2
Я теряю возможность разрешения метода на его фактический тип, а не на его базовый тип. Как это сокрытие доступа к базовому методу?
Далее, в документации по предупреждению в качестве решения предупреждения, указано, что:
Во-первых, вы можете указать переопределение для сделать процедуру производного класса также виртуальный, что позволяет унаследовать призывает по-прежнему ссылаться на оригинал процедура.
Теперь, если я создаю экземпляр TChild из TChild (без полиморфизма), унаследованный вызов в непереопределенном методе явно ссылается на исходную процедуру. Если я создаю экземпляр «Дочерний» из «TBase», вызов даже не преобразуется в метод «TChild», как я могу вызвать «Inherited», который вообще будет относиться к чему-либо?
Что я не понимаю?