2014-04-22 2 views
1

DELPHI를 사용하여 연산자 오버로딩을 사용하여 한 클래스의 데이터를 두 번째 클래스로 복사하는 방법은 무엇입니까?한 클래스의 데이터를 다른 클래스로 복사하는 방법

내 더미 응용 프로그램은 다음과 같이 진행됩니다

type 
    TClass_A = class 
    a: String; 
    end; 
    TClass_B = class(TClass_A) 
    b: String; 
    end; 

implementation  

procedure TForm1.Button1Click(Sender: TObject); 
var 
    a: TClass_A; 
    b: TClass_B; 
begin 
    a := TClass_A.Create; 
    b := TClass_B.create; 

    b := a; // <<-- What code should be here? Can I overload := operator? 
end; 
+1

이 작업은 RTTI를 사용하는 비용으로 쉽게 수행 할 수 있습니다. – whosrdaddy

답변

5

할당 연산자는 델파이로 오버로드 할 수 없습니다.

복사를 수행하는 방법을 소개해야합니다. 이를 수행하는 방법의 예는 TPersistent.Assign입니다. TPersistent에서 파생되고 가상의 Assign 메서드를 재정의하여 원하는 기능을 구현하는 것이 가장 이상적입니다.

+0

이 작업에 가장 적합한 프로그래밍 방식은 무엇입니까? 운영자 과부하가 아닌가요? – Franz

+0

제가 언급 한 것처럼 연산자 오버로딩은 옵션이 아닙니다. 나머지 옵션은 메소드를 소개하는 것입니다. –

+0

클래스 B에 대한 새로운 mthode를 추가하면 코드를 직접 작성할 수 있습니다. 이게 도우미의 일원이 될 수 있을까요? – Franz

3

다음은 새로운 스타일 RTTI (D2010 이상)에서이를 수행하는 방법의 작은 예입니다. 이 필드는 속성 (필드 제외) 만 복사하고 기본 클래스에서 가장 잘 작동하는 매우 기본적인 예제입니다 (TComponent에서 사용하지 않음). 대상 객체의 필드는 동일한 유형이어야합니다. 참고로, better examples 밖에 있습니다 :)

uses 
    Rtti,... 

function CopyObject(const FromObj, ToObj: TObject): Boolean; 

var 
    Ctx   : TRTTIContext; 
    FromObjType : TRttiType; 
    ToObjType : TRttiType; 
    FromField : TRttiField; 
    ToField  : TRttiField; 

begin 
Result := False; 
FromObjType := Ctx.GetType(FromObj.ClassInfo); 
ToObjType := Ctx.GetType(ToObj.ClassInfo); 
for FromField in FromObjType.GetFields do 
    begin 
    ToField := ToObjType.GetField(FromField.Name); 
    if Assigned(ToField) then 
    begin 
    if ToField.FieldType = FromField.FieldType then 
     ToField.SetValue(ToObj, FromField.GetValue(FromObj)); 
    Result := True; 
    end; 
    end; 
end; 
+0

이렇게하면'TListBox'를'TTimer'에 복사 할 수 있습니다. 그게 좋은 생각인지 모르겠다. 또한 참고 문헌 인 회원들을 어떻게 대우합니까? 얕은 사본? 그게 이상인가요? –

+1

나는 내 대답에서 말했듯이, 그것은 아주 기본적인 예이며 구성 요소가 아닌 PODO (또는 DTO)에 가장 적합합니다. 참고로 필드 이름이 일치하지 않기 때문에이 답변은 OP의 질문에 응답하지 않습니다 ... – whosrdaddy

관련 문제