虚方法错误 Abstract Error

//虚方法错误
---------------------------
Debugger Exception Notification
---------------------------
Project GQ.exe raised exception class EAbstractError with message 'Abstract Error'.
---------------------------
Break   Continue   Help   
---------------------------
问题所在:
当时父类有虚函数  function GetSubForm(SubFormName:string):TForm;virtual;abstract;
子类 function  GetSubForm(SubFormName:string):TForm; override; 没有加override
造成通过父类调用执行子类的方法时,发现没有实现父类的方法,因为若子类中没有加override关键字是相当于了重写了方法,而不是实现了父类的方法;//可以先判断一下这个类的这个虚方法是否有实现
function MethodIsImplemented(const AClass : TClass; MethodName : string) : Boolean;
var
  m : TRttiMethod;
begin
  Result := False;
  m := TRttiContext.Create.GetType(AClass.ClassInfo).GetMethod(MethodName);
  if m <> nil then
    Result := CompareText(AClass.ClassName, m.Parent.Name) = 0;
end;
//调用
  if MethodIsImplemented(AfrmPluginObject.FormClass, 'DoonRecvDBFailEvent')then
T1 = Class(TObject) //这个我们假设是基类

public

    function f1();virtual;abstract;
End;

T1s = Class(T1)        //这个是我们用到的类的父类

public

    function f1();override;
End;

T1ss = Class(T1s)        //这个是我们用到的类(开始的认为)



public

    function f1();override;
End;

//这样一看一切都正常
//
//但是这个工程用了动态类型的方法
//
//即:O1 : T1;然后在动态找到类型后 O1 := T(动态找到的类型).create;接着O1.f1;
//
//结果发现还有一个类:



T1a = Class(T1)        //这个是我们用到的类的父类

public

    function f2();virtual;abstract;
End;

T1as = Class(T1a)        //这个是我们用到的类


public

    function f2();override;
End;
//其实O1是T1as。
//
//这样我既不能直接用f1,也不能直接用f2。只能用以下方法处理。
//
//在T1中添加f2,然后在将O1.f1改为:

if O1.classParent = T1a then

     O1.f2

else

     O1.f1;
网上例子解析,羞涩难懂-

说的是两个不懂的子类,A子类是有f1方法,B子类有f2方法,执行f1还是f2 通过判断一下子父类再执行。感觉这个例子有缺陷。

posted @ 2016-08-31 10:59  海蓝7  阅读(669)  评论(0编辑  收藏  举报