我有一个基类TThread
它有子类如TThreadSock
和TThreadPool
,它们覆盖.Terminate()
方法。而这些孩子的(如TThreadSockDownload
或TThreadPoolCollect
)inherite这些.Terminate()
方法的孩子的(甚至可能会覆盖它们):调用子类非虚方法或设置子类属性
type
TThreadSock= class(TThread)
procedure Terminate; // Hides TThread.Terminate
end;
TThreadSockDownload= class(TThreadSock);
TThreadSockUpload= class(TThreadSock)
procedure Terminate; // Hides TThreadSock.Terminate
end;
TThreadPool= class(TThread)
procedure Terminate; // Hides TThread.Terminate
end;
TThreadPoolCollect= class(TThreadPool);
我的问题是:我有一个可以容纳一切的列表,所以最常见的分母是TThread
。而且从那个基础课程我需要调用最“幼稚”的.Terminate()
方法。目前我的方法是这样的:
var
oThread: TThread;
begin
oThread:= GetNextThread();
if oThread is TThreadSockDownload then TThreadSockDownload(oThread).Terminate() else
if oThread is TThreadSockUpload then TThreadSockUpload(oThread).Terminate() else
if oThread is TThreadPoolCollect then TThreadPoolCollect(oThread).Terminate() else ...
...并且你会明白这会导致什么。没多少提及,我必须在其他地方使用此代码。如果我打电话oThread.Terminate()
那么基类的代码被执行,这不是我想要的。并且将方法定义为virtual
也不会完全起作用,因为每个儿童级别都可能是“最后一个”级别。或不。
我的最终目标是尽可能地概括这个,所以我不需要要求每个班都作为候选人。也许我错过了一些基本的东西,比如GetRealClass(oThread).Call('Terminate');
和GetRealClass(oThread).Set('Stop', TRUE);
会是一个梦想。
我至少能够推广这个代码,所以我只需要写一次?像对象FindMethod
我也有告诉它的类类型?
您需要在此处添加更多信息。 '终止'不是虚拟的,所以当你说你'重写'终止'“,这是不正确的。您不能覆盖非虚拟方法。你应该显示你的'Terminate'方法的实现,它*隐藏*而不是*覆盖*。当然,正确的解决方案是调用虚拟方法。虚拟方法应该是我们不能说的。可能你应该调用'Terminate',但是重载'TermaintedSet'。但是这个问题没有足够的细节让我们说。当然,你最后的两段并不是解决方案! –
我知道“覆盖”是一个关键字,但我的意思是非技术性的术语,如重新定义,或者是:“隐藏”。增强的类定义细节。 – AmigoJack
你的编辑没有帮助,因为我们看不到这些'Terminate'方法。准确使用术语非常重要。 –