2013-05-12 2 views
-1

상속 구현하는 방법 :이 개 가능한 자식 클래스 수 있습니다 내가 부모 클래스가

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; 

런타임시 나는 th 전자 같은 것을 사용하여 자식 클래스의 2 개 종류 :

if account is TEmailIMAPAccount then 
    ... 
else if account is TEmailPOP3Account then 
    ... 

내 원래의 클래스 선언과 TList를 선언이 요구 사항에 적합하지 않습니다 확신합니다. 이 시나리오에서 어떤 변화가 필요합니까?

TIA.

답변

1

귀하의 타입 선언은 절대적으로 중요합니다. 문제는 스트림에서 항목을 읽을 때 어떤 유형인지 알지 못하는 것입니다. 인스턴스가 아직 없기 때문에 사용할 수 없습니다.

각 인스턴스의 스트림에 형식 코드를 작성하여이 문제를 해결하십시오. 스트림에서 읽을 때 유형 코드를 읽고이를 사용하여 인스턴스화 할 유형을 결정하십시오.

지속성 스트리밍 이런 종류의 난 단지 (계정 속성을 작성합니다 등 XML, JSON을 방출하는 지속성 프레임 워크, YAML

0

를 사용하는 대신 전체, 매우 구현 고유의 객체를 직렬화 너무 쉽다 메일 계정 유형, 사용자 자격 증명, 서버/포트/보안 설정)을 파일에 저장합니다.

이렇게하면 기존 설정 파일 호환성을 손상시키지 않고 구현을 수정할 수 있습니다.

또한 if <object> is <class> ... else if <object> is <otherclass> ... 솔루션에 대해서도 생각조차하지 않을 것입니다. 대신 간단한 열거 형 TAccountType = (atPOP3, atIMAP)을 정의한 다음 계정의 계정 유형 속성에 따라 사례 구조로 분기하거나 Strategy pattern을 사용하십시오.

+0

나는 이것을 정확하게하고있다. 하지만 어딘가에 문제가 생기는 이유는 나중에 올바른 유형을 얻지 못하기 때문입니다. 나는 지금 당장 문제를 풀려고 노력하고 있으며, 만약 그 해결책이 나를 벗어나면 더 많은 것을 올릴 것이다. 감사! –

+0

각 항목이 지속되는 방법에 대해 Q에 아무것도 없습니다. 열거 형을 사용하면 문제가 없지만 파일에 저장해야합니다. 이것이 핵심 포인트입니다. –

+0

문제는 내 코드가 너무 복잡하여 코드의 일부만 게시하고 누구나 이해할 수 있기를 기대하기 어렵다는 것입니다. 문제를 보려면 830 라인의 전체 유닛을 볼 필요가 있습니다. –

관련 문제