다음은 주정섭님의 글입니다.
---------------------------------------------------------------------------------
* 추상 메소드
델파이 컴포넌트에서 어떤 메소드들은 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.
|