주정섭님께서 그렇게 답변하셨다면 아마도 C++적인 관점에서 이해하신 것 같은데요.
델파이에서는 추상 클래스라도 인스턴스 생성이 됩니다. 원래 막지 않았구요. 언어 설계자의 철학 차이로 인해 C++에서는 아예 인스턴스를 생성하지 못하게 막혀 있는 것이고, 델파이에서는 EAbstractError 런타임 에러를 내는 것입니다.
ibuilder 님이 쓰신 글 :
: 다음은 주정섭님의 글입니다.
:
: ---------------------------------------------------------------------------------
: * 추상 메소드
: 델파이 컴포넌트에서 어떤 메소드들은 abstract 로 선언된다. VCL 에서는 이러한 추상 메소드들이 ‘custom’이라는 이름으로 시작하는 클래스에서만 존재한다. 이러한 클래스들은 그들자신이 추상 클래스이고 이 클래스들은 오직 다른 하위 클래스들의 상속을 위해서만 존재한다. 이러한 추상적인 구성 요소를 가진 클래스는 인스턴스 객체를 생성할 수 없다.
: ----------------------------------------------------------------------------------
:
: 그런데 제가 만든 추상클래스에선 객체가 생성되더군요.
: 아래 소스에서 AbstractClass 클래스는 AbstractMethod란 추상메서드를 가지고 있습니다. 그런데 ac := AbstractClass.Create; 로 버젖이 인스턴스도 만들어 지고, 생성자 마져 실행되더군요. 다만 추상메서드를 호출할때에만 런타임 에러를 네더군요. 물론 이 클래스를 상속한 클래스 인스턴스 에서의 추상메서드 호출은 문제 없구요.
:
: 컴파일 할때, 추상클래스로 인스턴스를 만들려한다는 경고만 낼뿐, 생성에 문제가 없던데, 도대체 이게 납득이 되지 않습니다.
: 무엇이 잘못된것일까요?
: 또 한가지 의문은 추상클래스를 상속한 클래스에서 추상메서드를 구현하지 않아도 에러를 발생시키지 않더군요.
: C#에서는 단번에 컴파일 에러를 내고 벗어 버리던데.....
:
: 질문을 요약하면
: 1) 추상클래스에서 인스턴스가 만들어 지는 이유.
: 2) 추상클래스를 상속한 하위클래스에서 추상메서드를 구현하지 않아도 컴파일 에러가 없는이유..
:
: 도움 부탁드립니다. 감사합니다.
:
:
: program Project3;
:
: {$APPTYPE CONSOLE}
:
: uses
: SysUtils;
:
: type
: AbstractClass = class(TObject)
: constructor Create;
: procedure AbstractMethod; virtual; abstract;
: end;
:
: ChildObject = class(AbstractClass)
: constructor Create;
: procedure AbstractMethod; override;
: end;
:
: constructor AbstractClass.Create;
: begin
: writeln('constructor message');
: end;
:
: constructor ChildObject.Create;
: begin
: inherited;
: end;
:
: procedure ChildObject.AbstractMethod;
: begin
: writeln('Child AbstractMethod Message');
: end;
:
: var
: ac : AbstractClass;
: co : ChildObject;
: begin
: ac := AbstractClass.Create; // 추상클래스의 인스턴스 생성 , 컴파일할때 Error가 되어야 하지 않나요?
: ac.AbstractMethod(); // runtime error
:
: co := ChildObject.Create;
: co.AbstractMethod(); // Ok
: readln;
: end.
|