2009-04-21 4 views
21

TObject 또는 TPersistent에서 파생 된 클래스의 생성자에서 "상속"을 호출해야합니까?TObject의 "생성자"생성자에서 상속되는 사용

constructor TMyObject.Create; 
begin 
inherited Create; // Delphi doc: Do not create instances of TPersistent. Use TPersistent as a base class when declaring objects that are not components, but that need to be saved to a stream or have their properties assigned to other objects.  
VectorNames := TStringList.Create; 
Clear; 
end; 

답변

38

예. 그것은 사실이 아니지만 무해합니다. 실제로 상속 된 생성자를 호출하는 것에 대해서는 일관되게 가치가 있다고 생각합니다. 실제로 구현이 있는지 확인하지 않습니다. 어떤 사람들은 Embarcadero가 앞으로 TObject.Create에 대한 구현을 추가 할 수 있기 때문에 상속 된 Create를 호출 할 가치가 있다고 말하지만, 이것이 사실 일지는 의심 스럽습니다. 그것은 상속 된 Create를 호출하지 않는 기존 코드를 깨뜨릴 것입니다. 여전히 일관성을 유지하기 위해 전화하는 것이 좋습니다.

+0

참으로 좋은 습관입니다 –

+0

"아무것도하지 않습니다"?? !! 기본 객체 저장을 시작합니다! 그리고 상속받는 기본 클래스에 정의 된 필수 항목을 수행 할 수도 있습니다. 그렇게하지 않으면 최악의 오류나 버그가 발생할 수 있습니다. 즉, 어떤 일이 일어나는지 알지 못하는 것입니다. –

+2

IIRC에서 기본 저장소는 생성자 (만들기)가 호출되기 전에 이미 할당되어 있습니다. – mj2008

13

나는 항상 이것을한다. 공통의 조상이 생성자가있는 경우

  1. , 당신이 그것을 호출하는 것을 잊지 수

    당신이 상속 호출, 리팩토링과 공통 조상에 코드를 이동하는 경우 생성은 다음과 같은 장점이 있습니다.

  2. 공통 조상에 다른 매개 변수를 사용하는 생성자가있는 경우 컴파일러에서이를 경고합니다.
+3

Craig가 올바른 과정이지만이 또한 내 상속 된 Create, 일관성있는 것보다 더 많은 것 –

2

"procedure AfterConstruction"을 무시할 수도 있습니다. 이 프로시 저는 어떤 종류의 생성자에 관계없이 항상 호출됩니다.

예를 들어
public 
    procedure AfterConstruction; override; 
end; 

procedure TfrmListBase.AfterConstruction; 
begin 
    inherited; 
    //your stuff, always initialized, no matter what kind of constructor! 
end; 

: 당신은 그런 TComponent.Create 같은 일반 TObject.Create (AOwner) 또는 사용자 정의 (과부하) 생성자가 아닌 다른 생성자로 객체를 생성하려는 경우, 당신이 얻을 수있는 문제가 있기 때문에 override가 호출되지 않고 (이 경우) "VectorNames"변수가 0이됩니다.

+3

재정의 된 생성자가 호출되지 않으면 자손 클래스의 버그입니다. 자손 클래스 개발자가 걱정하지 않아도되는 문제이며, 호출을 건너 뛸 수 있습니다. AfterConstruction을 사용하면 동일한 이유로 생성자에 대한 호출을 건너 뛸 수 있습니다. 자손은 자체 구현을 제공하고 상속 된 메서드를 호출하지 않습니다. –

+2

Rob : TObject 자손을 생성하는 팩토리 클래스를 만들면 TObject.Create() 가상하지 않기 때문에!) 그리고 공장에서 TComponent 자손을 만들면 그것은 다른 생성자 (Create (AOwner))를가집니다. 당신은 AfterConstruction을 사용해야합니다 : 어떤 종류의 생성자 이건 관계없이 항상 호출됩니다. –

2

매우 최적화 된 생성자가 필요한 경우를 제외하고는이 함수를 호출합니다.