Вы должны не только делать методы виртуальными, вы должны объявлять чистый виртуальный базовый класс, а другие классы должны использовать только чистое имя виртуального базового класса.Теперь вы можете использовать то, что мы называем «принципом подстановки Лискова», и вы можете создать столько конкретных подтипов абстрактного базового класса, сколько вам нужно.Поскольку абстрактный базовый класс работает так же, как интерфейс работает в Delphi, за исключением части подсчета ссылок, вы получаете лучшее из обоих миров.Вы действительно можете сохранить код своего приложения простым и таким образом уменьшить количество плохих связей, плюс вы получите проверяемые модулем «составные объекты», которые вы собираете сами.
// in UnitBase.pas
TMyClassBase = class
public
procedure Method1; virtual; abstract;
procedure Method2; virtual; abstract;
end;
// in UnitReal.pas
TMyClassReal = class(TMyClassbase)
public
procedure Method1; override;
procedure Method2; override;
end;
// in UnitMock.pas
TMyClassMock = class(TMyClassbase)
public
procedure Method1; override;
procedure Method2; override;
end;
В месте, где используется «TMyClass», изменитеиспользовать TMyClassbase:
TMyOtherClass = class(TMyOtherClassBase)
private
FMyThing:TMyClassbase;
public
property MyThing:TMyClassBase read FMyThing write FMyThing;
end;
Подключив TMyOtherclass во время выполнения, вы можете решить, использовать ли действительный или фиктивный класс:
// in my realapp.pas
MyOtherClassObj := TMyotherClass.Create;
MyOtherClassObj.MyThing := TMyOtherClassReal.Create; // real object
// in my unittest.pas
MyOtherClassObj := TMyotherClass.Create;
MyOtherClassObj.MyThing := TMyOtherClassMock.Create; // mock object
(не забудьте найти способбесплатно MyOtherClassObj.MyThing позже, или у вас будет утечка)