업데이트 내역: No.1
업데이트 시간: 2001-11-01 20:09
업데이트: Musicwind®
업데이트 참고 사항: 첫 번째 초안이 완료되었습니다.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~ ~~~~~~~~~~~~~~~~~~~~~~~
요약:
이 문서에서는 특정 추상 클래스를 기반으로 하는 많은 하위 클래스인 Dll의 클래스를 내보내는 방법에 대해 설명합니다 . 이 기술은 다형성(Polymorphism) 개념을 사용하여 플러그인과 유사한 효과를 얻을 수 있게 해줍니다.
대상 독자:
다형성의 개념을 이해합니다. 메타클래스의 개념을 이해합니다.
기술적 난이도:
6/10 .
Dll에서 클래스를 내보내려면 가장 먼저 생각해야 할 것은 bpl 패키지를 사용하는 것입니다. 이 방법의 한 가지 단점은 사용자가 패키지에 어떤 클래스가 포함되어 있는지 알아야 한다는 것입니다. 이는 클래스의 이름을 알아야 함을 의미합니다. 이는 어떤 의미에서 사용자가 하위 레이어를 정의하는 상황을 상상해 보세요. 추상 클래스, 그리고 많은 애플리케이션 클래스(구체적 클래스) class) 그런 다음 사용자는 특정 클래스를 알지 못해도 이러한 클래스를 사용할 수 있기를 바라고 있습니다. 이렇게 말하는 것이 다소 신비스러워 보이지만 실제 상황은 실제로 그렇습니다. 추상을 정의할 때 예측할 수 없기 때문입니다. 클래스 미래에는 얼마나 많은 특정 클래스가 존재하게 될까요? 그렇다면 이러한 수요를 실현하려면 어떤 기술이 필요할까요?
실제로 이를 구현하는 데 따른 기술적 어려움은 그리 어렵지 않습니다. 여기서 저자는 새로운 아이디어를 끌어내기 위한 방법으로 모든 사람에게 실제 경험을 바치고 다른 더 나은 방법을 보기를 희망합니다!
다음에서는 먼저 이 방법과 관련된 몇 가지 기본 지식을 소개한 다음 예제를 사용하여 구체적인 구현을 보여줍니다.
1. 기본 개념
클래스 참조 유형(class-reference type)이라고도 불리는 메타 클래스(meta class)는 클래스의 유형으로 볼 수 있으며, 이 유형으로 선언된 변수의 값은 클래스를 나타낸다. 예를 들어:
유형
TClass = TObject의 클래스;
이는 메타클래스 유형을 선언합니다. 그런 다음 다음과 같은 변수 선언을 가질 수 있습니다.
바르
A클래스: T클래스;
그런 다음 다음과 같이 사용할 수 있습니다.
AClass := TObject;
또는:
AClass := TButton;
또는:
A클래스 := TForm;
등.
TClass는 TObject 유형의 메타클래스이고 TButton, TForm 등은 모두 TObject에서 파생되므로 TButton 및 TForm과 같은 값은 AClass에서 허용됩니다.
그러면 다형성이라는 개념을 활용하여 클래스 변수 AClass를 유연하게 사용할 수 있습니다. 이는 아래의 구체적인 구현을 위한 기본 지식이기도 합니다.
2. 구체적인 구현
첫 번째 단계는 추상 클래스를 만드는 것입니다.
우리는 이렇게 간단한 선언을 사용합니다. 추상 클래스는 추상 메서드만 제공하지만 문제 설명에는 영향을 주지 않습니다.
TMyBaseForm = 클래스(TForm)
보호됨
함수 GetTitle: pchar; 추상;
끝;
MyBaseFormClass = TMyBaseForm 클래스;
우리가 논의하고 싶은 것은 기술적 타당성이므로 추상 클래스가 얼마나 많은 실용적인 메서드와 인터페이스를 제공하는지 논의하지 않겠습니다. 이 인터페이스를 정의하는 작성자의 원래 의도는 변경되는 제목을 원하는 만큼 얻는 것이고 GetTitle의 특정 반환 값은 하위 클래스에서 구현되어야 한다고 가정합니다. 더욱이 저자는 하위 클래스의 코드가 Dll에서 구현되고 기본 프로그램과 분리될 수 있기를 바라고 있습니다. 이 방법은 플러그인 특징이 있으며 플러그 앤 플레이의 일부 기능을 실현할 수도 있습니다. 매력적인? 그렇다면 다음에는 무엇을 해야 할까요?
먼저, 메인 프로그램과 Dll 프로그램은 위에 선언된 유닛을 포함해야 합니다. 그런 다음 메인 프로그램은 Dll을 동적으로 로드하고 클래스를 동적으로 로드하는 역할을 담당하며, Dll은 하위 클래스를 구현하는 역할을 담당합니다.
먼저 Dll에 대해 이야기해 보겠습니다. Dll은 무엇을 해야 할까요?
두 번째 단계는 Dll 에서 하위 클래스를 내보내는 것 입니다.
우리는 다음 두 가지 내보낸 기능을 설계했습니다.
1. 함수 GetClassCount: 정수;
이 Dll에는 여러 하위 클래스가 있다고 호출자에게 알립니다.
2. 함수 GetClassTypeByIndex(const iIndex: 정수;
var ClassType: MyBaseFormClass): WordBool;
인덱스로 특정 하위 클래스를 가져옵니다. 여기서 ClassType 유형은 MyBaseFormClass이며 이는 해당 값이 TMyBaseForm에서 상속된 명확한 클래스임을 나타냅니다.
가능한 구현 중 하나는 다음과 같습니다.
함수 GetClassCount: 정수;
시작하다
result := 3; //이 DLL에서 3개의 클래스가 내보내졌음을 나타냅니다.
끝;
함수 GetClassTypeByIndex(const iIndex: 정수;
var ClassType: MyBaseFormClass): WordBool;
시작하다
결과 := 참;
케이스 iIndex
0: 클래스 유형 := TFrmTest1;
1: 클래스 유형 := TFrmTest2;
2: 클래스 유형 := TFrmTest3;
또 다른
결과 := 거짓;
끝;
끝;
물론, TFrmTest1, TFrmTest2, TFrmTest3이 위치한 유닛은 해당 유닛의 Use 목록에 포함되어야 합니다. TFrmTest1의 구현은 다음과 같습니다.
TFrmTest1 = 클래스(TMyBaseForm)
보호됨
함수 GetTitle: PChar 재정의;
끝;
함수 TFrmTest1.GetTitle: Pchar;
시작하다
result := 'TFrmTest1에서 안녕하세요';
끝;
마지막으로 내보내기 목록에 GetClassCount 및 GetClassByIndex를 추가하는 것을 잊지 마십시오. 그러면 Dll 프로젝트를 빌드할 때 프로젝트 옵션-패키지에서 "런타임 패키지 사용"을 체크해주세요. 구체적인 이유는 나중에 논의하겠습니다.
이 시점에서 Dll에 대한 작업이 끝났습니다.
세 번째 단계는 기본 프로그램 드라이버 엔진을 구현하는 것입니다.
이 단계는 상대적으로 쉽습니다. Dll을 동적으로 로드한 다음 GetClassCount 함수를 호출하고 GetClassByIndex를 호출하는 것뿐입니다. 키 코드:
변수 AClass: TMyBaseClass;
AForm: TMyBaseForm;
I, iCount: 정수;
bl결과: 부울;
시작하다
//FPGetClassProc가 GetClassCount 함수를 가리키고 FPGetClassByIndexProc가 GetClassByIndex를 가리킨다고 가정하고 동적 라이브러리 로드에 대한 부분을 생략한 후 다음을 수행합니다.
iCount := FPGetClassProc;
for I := 0 ~ iCount ?C 1 do
시작하다
AClass := FPGetClassByIndex(I, blResult);
blResult이면
시작하다
AForm := AClass.Create(application);
AForm.Caption := AForm.GetTitle;
AForm.Show;
끝;
끝;
//…
끝;
Dll과 마찬가지로 출력 파일을 생성할 때 런타임 패키지를 사용하도록 선택해야 합니다. 이는 런타임 패키지를 사용하지 않으면 메모리에 동일한 클래스의 여러 복사본이 생성되므로 Is 연산자를 사용하면 False 결과가 반환되기 때문입니다.
Musicwind®@HangZhou.Zhejiang.China
2001-11-01
더 많은 기사
[ 기사 끝]