sorry,也许我错了 class a ca:a; void safe(cls:a) { } end;class b extends a void method(); end;
好象不好实现,用abort不知道行不行
搂住问题描述不够清楚,不过这种想法当然是可行的,即所谓“先见之明”。根据实际情况可以有多种做法。比如: 1、父类设置条件,子类根据条件判断,决定是否执行相应代码。 TParent = class procedure OneProc(var CanGo: Boolean); virtual; end; TChild = class(TParent) procedure OneProc(var CanGo: Boolean); override; end;var Form1: TForm1;implementation{$R *.dfm}procedure TParent.OneProc(var CanGo: Boolean); begin CanGo := ClassType.ClassNameIs('TParent'); //如果是通过子类而不是TParent本身调用方法OneProc,则设置CanGo = False; end;procedure TChild.OneProc(var CanGo: Boolean); begin inherited; if CanGo then ShowMessage('go'); end;procedure TForm1.Button1Click(Sender: TObject); var CanGo: Boolean; begin with TChild.Create do begin OneProc(CanGo); Free; end; end;2、在父类代码中生成(静态)异常。如: TParent = class procedure OneProc; virtual; end; TChild = class(TParent) procedure OneProc; override; end;var Form1: TForm1;implementation{$R *.dfm}procedure TParent.OneProc; begin if not ClassType.ClassNameIs('TParent') then Abort; end;procedure TChild.OneProc; begin inherited; ShowMessage('go'); end;procedure TForm1.Button1Click(Sender: TObject); begin with TChild.Create do begin OneProc; Free; end; end;———————————————————————————————————— 宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。 ————————————————————————————————————
樓主的需求并不一定要你所說的那樣來解決問題! 通常是這樣來實現: 將你的 TForm1.OnClick(Sender:TObject); begin if XXXXXXX then ....... // 防止执行子类中的代码 end;的Onclick(Sender:Tobject) 改為靜態, 另寫一虛擬方法如: DoOnclick(Sender:Tobject);virtual; 子類將DoOnclick 做override 父類就可以這樣寫 if not XXXXXXX then DoOnclick // 防止执行子类中的代码
抛出异常应该可以解决你的问题。
就我所知的知識, 無法絕對阻止;
因為子類可以重載, 或覆蓋 掉父类 的function ,procedure!!
C++ 或 java 應該可以!!!
class a
ca:a;
void safe(cls:a)
{ }
end;class b extends a
void method();
end;
1、父类设置条件,子类根据条件判断,决定是否执行相应代码。 TParent = class
procedure OneProc(var CanGo: Boolean); virtual;
end; TChild = class(TParent)
procedure OneProc(var CanGo: Boolean); override;
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TParent.OneProc(var CanGo: Boolean);
begin
CanGo := ClassType.ClassNameIs('TParent'); //如果是通过子类而不是TParent本身调用方法OneProc,则设置CanGo = False;
end;procedure TChild.OneProc(var CanGo: Boolean);
begin
inherited;
if CanGo then ShowMessage('go');
end;procedure TForm1.Button1Click(Sender: TObject);
var
CanGo: Boolean;
begin
with TChild.Create do
begin
OneProc(CanGo);
Free;
end;
end;2、在父类代码中生成(静态)异常。如:
TParent = class
procedure OneProc; virtual;
end; TChild = class(TParent)
procedure OneProc; override;
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TParent.OneProc;
begin
if not ClassType.ClassNameIs('TParent') then
Abort;
end;procedure TChild.OneProc;
begin
inherited;
ShowMessage('go');
end;procedure TForm1.Button1Click(Sender: TObject);
begin
with TChild.Create do
begin
OneProc;
Free;
end;
end;————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————
將你的
TForm1.OnClick(Sender:TObject);
begin
if XXXXXXX then
....... // 防止执行子类中的代码
end;的Onclick(Sender:Tobject) 改為靜態, 另寫一虛擬方法如: DoOnclick(Sender:Tobject);virtual;
子類將DoOnclick 做override
父類就可以這樣寫
if not XXXXXXX then
DoOnclick // 防止执行子类中的代码