请问在父类的代码中如何阻止子类中代码的执行?

siaosa 2003-10-17 09:35:39
请问在父类的代码中如何阻止子类中代码的执行?
例如:
TForm1.OnClick(Sender:TObject);
begin
if XXXXXXX then
....... // 防止执行子类中的代码
end;
...全文
70 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hewin 2003-12-12
  • 打赏
  • 举报
回复
樓主的需求并不一定要你所說的那樣來解決問題!

通常是這樣來實現:
將你的
TForm1.OnClick(Sender:TObject);
begin
if XXXXXXX then
....... // 防止执行子类中的代码
end;

的Onclick(Sender:Tobject) 改為靜態, 另寫一虛擬方法如: DoOnclick(Sender:Tobject);virtual;
子類將DoOnclick 做override
父類就可以這樣寫
if not XXXXXXX then
DoOnclick // 防止执行子类中的代码
XXSingle 2003-10-30
  • 打赏
  • 举报
回复
只能向父类宴请执行条件,执不执行由子类决定
vcshcn 2003-10-30
  • 打赏
  • 举报
回复
有2种情况
1.先执行父类代码,再执行子类代码:结果当然没有阻止,因为父类没阻止住,子类执行了
2.先执行子类代码,再执行父类代码:结果是没有阻止,因为子类先执行了

结果就是不可能
lxpbuaa 2003-10-23
  • 打赏
  • 举报
回复
搂住问题描述不够清楚,不过这种想法当然是可行的,即所谓“先见之明”。根据实际情况可以有多种做法。比如:
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;

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————
delphi_xizhousheng 2003-10-22
  • 打赏
  • 举报
回复
好象不好实现,用abort不知道行不行
vcshcn 2003-10-22
  • 打赏
  • 举报
回复
sorry,也许我错了
class a
ca:a;
void safe(cls:a)
{

}
end;

class b extends a
void method();
end;
DongXF 2003-10-22
  • 打赏
  • 举报
回复
你現在能阻止你兒子將來娶個外國老婆嗎 ?
DongXF 2003-10-22
  • 打赏
  • 举报
回复
父類無法預知子類如何繼承,無法防止,何況你如果不想讓子類繼承,何必做成類呢
vcshcn 2003-10-21
  • 打赏
  • 举报
回复
我觉的问题 是违反面象对象的 或者你是这个意思 比如安全代理模式
vcshcn 2003-10-21
  • 打赏
  • 举报
回复
parent根本就不知道到底有没有child继承,如何阻止呀
FrameSniper 2003-10-20
  • 打赏
  • 举报
回复
呵呵,DFW的朋友已经给了你很明确的答复了

你要实现的功能在Delphi中根本不可能存在!
aiirii 2003-10-20
  • 打赏
  • 举报
回复
>>请问在父类的代码中如何阻止子类中代码的执行?
就我所知的知識, 無法絕對阻止;
因為子類可以重載, 或覆蓋 掉父类 的function ,procedure!!
C++ 或 java 應該可以!!!
windindance 2003-10-20
  • 打赏
  • 举报
回复
Raise Exception.Create('错误');
抛出异常应该可以解决你的问题。
liuziran 2003-10-20
  • 打赏
  • 举报
回复
如果 子类是从你自己编写的父类继承下来的,是可以做到的
Spacesoft 2003-10-18
  • 打赏
  • 举报
回复
完全没弄明白,你要做什么?“防止执行子类中的代码”是什么意思?给个例子看看。

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧