我有一個父類,可能有兩個子類:如何實現繼承
TEmailBaseAccount = class
Connected: boolean;
setting: TEmailAccountSettings;
folders: TEmailAccountFolders;
procedure Connect; virtual; abstract;
end;
TEmailIMAPAccount = class(TEmailBaseAccount)
IdIMAP4: TIdIMAP4;
OpenSSLHandler: TIdSSLIOHandlerSocketOpenSSL;
procedure Connect; override;
end;
TlEmailPOP3Account = class(TEmailBaseAccount)
IdPOP3: TIdIPOP3;
OpenSSLHandler: TIdSSLIOHandlerSocketOpenSSL;
procedure Connect; override;
end;
我使用的是通用從TList保持電子郵件帳戶的列表:
TEmailAccountList = class(TList<TEmailBaseAccount>)
procedure SaveToStream(Stream: TStream);
procedure LoadFromStream(Stream: TStream);
constructor Create(AOwner: TObject);
destructor Destroy;
end;
和使用以下代碼將電子郵件帳戶添加到列表中:
procedure TEmailAccountList.LoadFromStream(Stream: TStream);
var
a, c: Integer;
e: TEmailBaseAccount;
begin
c := ReadStreamInt(Stream);
for a := 0 to c - 1 do
begin
e := TEmailBaseAccount.Create(FOwnerEmailEngine);
e.LoadFromStream(Stream);
Add(e);
end;
end;
procedure TEmailAccountList.SaveToStream(Stream: TStream);
var
a, c: Integer;
e: TEmailBaseAccount;
begin
c := Count;
WriteStreamInt(Stream, c);
for a := 0 to Count - 1 do
Items[a].SaveToStream(Stream);
end;
在運行時,我需要區分第e 2類兒童班使用類似:
if account is TEmailIMAPAccount then
...
else if account is TEmailPOP3Account then
...
我確信我的原始類聲明和TList聲明不適合此要求。在這種情況下需要做什麼改變?
TIA。
我正在做這個。但在某個地方我遇到麻煩,因爲後來它沒有得到正確的類型。我現在正在努力自己解決這個問題,如果解決方案無法解決問題,我會發布更多信息。謝謝! – 2013-05-12 17:10:02
Q中沒有任何關於每個項目如何持續存在的信息。使用枚舉工作正常,但你必須把它放到文件中。這是關鍵。 – 2013-05-12 17:10:14
事情是我的代碼是如此複雜,它很難只發布一段代碼,並期望任何人都能理解。要看到這個問題,你需要看到整個單元是830行.... – 2013-05-12 17:31:45