我在類函數中,並且想知道父類類型是否爲TVMDNode類型。檢查ClassParent是否屬於X類型(不是:等於X類型)
「ClassParent is TVMDNode」不起作用。 (我不想要「ClassParent = TVMDNode」)。
我該如何完成這項任務:通過類層次結構進行鏈檢查而不需要請求子類實現自己的邏輯?
type
TOID = string;
TOIDPath = array of TOID;
class function TVMDNode.IsSupported(ANode: TOID): boolean; virtual;
begin
result := true;
end;
class function TVMDNode.Supports(ANodePath: TOIDPath): boolean; // not virtual;
var
n: integer;
begin
// Check if the last segment is supported by our class
n := Length(ANodePath);
if not IsSupported(ANodePath[n-1]) then
begin
result := false; Exit;
end;
SetLength(ANodePath, n-1);
// Recursively check if the previous segments are supported by the parent class, as long as they are of type TVMDNode (and therefore have the Supports() function)
// This logic is implemented in the base class TVMDNode only and shall be applied to every descendant class without requiring override
if ClassParent is TVMDNode then // <-- operator not applicable to this operand type
begin
if not (TVMDNode(ClassParent).Supports(ANodePath)) then
begin
result := false; Exit;
end;
end;
result := true; Exit;
end;
直到德爾福6
類家長是不是東西,隨時都在變化。爲什麼你想要檢查這個呢?當你寫一個課程時,你知道它是從哪裏繼承的,對嗎? – GolezTrol
我想實現後代的邏輯,所以他們不必一次又一次地實現相同的邏輯。例如:TB從繼承自TVMDNode的TA繼承。調用TB.Supports()應該通過TB.IsSupported(),TA.IsSupported()和TVMDNode.IsSupported()。 TVMDNode的後代只需要實現IsSupported()。 –
classparent是類從其下降的類。沒有理由檢查這個,就像我之前說過的。但我認爲你正在談論節點的父節點(在層次結構中),這是完全不同的事情。否則你的問題對我來說毫無意義。 – GolezTrol