C #과 .NET 프레임 워크는 델파이의 주요 개발자 인 앤더스 헤 즐스 버그 (Anders Hejlsberg)가 설계 한 본질적으로 "델파이가 자바처럼 느껴지도록 다시 작성했다"는 역사에 익숙한 사람들에게 잘 알려져 있습니다. 그 이후로 상황이 상당히 다양해졌지만, 유사점 초기에는 .NET이 실제로 볼랜드의 제품이라는 진지한 추측이있었습니다.
그러나 최근 몇 가지 .NET 관련 자료를 살펴 보았으며 Delphi의 가장 흥미롭고 유용한 기능 중 하나는 클래스 데이터 개념이라는 개념이 완전히 누락 된 것 같습니다. 익숙하지 않은 사람들에게 유형은 .NET TClass
의 Type
유형 과 유사한 클래스에 대한 참조를 나타냅니다 . 그러나 .NET Type
이 리플렉션에 사용 하는 경우 Delphi는 TClass
언어의 매우 중요한 내장 부분으로 사용합니다. 클래스 하위 유형 변수 및 가상 클래스 메서드와 같이 존재하지 않고 존재할 수없는 다양한 유용한 관용구를 허용합니다.
모든 OO 언어에는 가상 클래스가 있으며 다른 클래스는 다른 방법으로 동일한 기본 개념의 메소드를 구현 한 다음 호출되는 객체 인스턴스의 실제 유형에 따라 런타임에 올바른 메소드를 호출합니다. 델파이는이 개념을 클래스로 확장합니다. TClass 참조가 특정 클래스 하위 유형으로 정의 된 경우 (즉 class of TMyClass
, 변수 TMyClass
가 클래스 범위 가상 메소드가 첨부 된 (계층 외부에서는 상속 되지 않는 클래스 참조를 허용 할 수 있음을 의미 )) 실제 유형의 클래스를 사용하여 인스턴스없이 호출 할 수 있습니다. 예를 들어,이 패턴을 생성자에 적용하면 팩토리 구현이 간단합니다.
.NET에는 동등한 것으로 보이지 않습니다. 클래스 참조 (특히 가상 생성자 및 기타 가상 클래스 메서드)만큼 유용한 것처럼, 왜 그들이 빠진 이유에 대해 말한 적이 있습니까?
구체적인 예
양식 역 직렬화
Delphi VCL은 DFM
컴포넌트 계층을 설명하기위한 DSL 형식의 양식을 저장합니다 . 양식 판독기는 DFM 데이터를 구문 분석 할 때 다음과 같이 설명 된 오브젝트에서 실행됩니다.
object Name: ClassName
property = value
property = value
...
object SubObjectName: ClassName
...
end
end
여기서 흥미로운 것은 ClassName
부분입니다. 각 구성 요소 클래스 TClass
는 initialization
시간에 구성 요소 스트리밍 시스템에 등록합니다 (정적 생성자는 약간 다르지만 시작시 즉시 발생한다고 생각합니다). 클래스 이름을 키로 사용하여 문자열-> TClass 해시 맵에 각 클래스를 등록합니다.
각 구성 요소는 TComponent
에서 유래하며 단일 인수를 취하는 가상 생성자가 Owner: TComponent
있습니다. 모든 구성 요소는이 생성자를 재정 의하여 자체 초기화를 제공 할 수 있습니다. DFM 리더는 클래스 이름을 읽을 때 위에서 언급 한 해시 맵에서 이름을 찾아 해당 클래스 참조를 검색하거나 (없는 경우 예외 발생) 가상 TComponent 생성자를 호출합니다. 등록 함수는 TComponent에서 내려 오는 데 필요한 클래스 참조를 사용하기 때문에 적절한 유형의 객체로 끝납니다.
이 기능이 부족하기 때문에 WinForms와 동등한 기능은 ... 음 .. .NET 언어를 완전히 다시 구현하려면 새로운 .NET 언어가 필요합니다. 생각할 때 약간 충격적입니다. CLR의 핵심은 여러 언어가 동일한 기본 인프라를 사용하도록하는 것이므로 DFM 스타일 시스템은 완벽하게 이해 될 것입니다.
확장 성
내가 작성한 이미지 관리자 클래스 에는 데이터 소스 (예 : 이미지 파일의 경로)가 제공되고 컬렉션에 없지만 데이터 소스에서 사용 가능한 이름을 검색하려고하면 새 이미지 객체를 자동으로로드 할 수 있습니다. class of
생성 할 새 객체의 클래스를 나타내는 기본 이미지 클래스 로 입력 된 클래스 변수 가 있습니다. 기본적으로 제공되지만 특별한 목적으로 새 이미지를 만들 때 이미지를 다른 방식으로 설정해야한다는 몇 가지 사항이 있습니다. (알파 채널없이 생성하고 PNG 파일에서 특수 메타 데이터를 검색하여 스프라이트 크기 등을 지정하는 등)
이것은 많은 양의 구성 코드를 작성하고 새로운 객체를 만들 수있는 모든 메소드에 특수 옵션을 전달하여 수행 할 수 있습니다 ... 또는 가상 메소드를 재정의하는 기본 이미지 클래스의 서브 클래스를 만들 수 있습니다 해당 측면이 구성된 다음 try / finally 블록을 사용하여 필요에 따라 "기본 클래스"특성을 임시로 대체 한 후 복원하십시오. 클래스 참조 변수로 수행하는 것이 훨씬 간단하며 대신 제네릭으로 수행 할 수있는 것이 아닙니다.
TClass
샘플 코드와 함께 유용한 유용한 하나 또는 두 개의 구체적인 예제를 제공 할 수 있습니까 ? 에 대한 내 커서 인터넷 연구 에서 매개 변수로 전달할 수 있음을 TClass
발견했습니다 TClass
. 이것은 Generics를 사용하여 .NET에서 수행됩니다. 팩토리 메소드는 단순히 static
.NET으로 표시 되며 클래스 인스턴스를 실행할 필요가 없습니다.
TClass
는 컴파일러 지원이 필요한 기본 언어 기능입니다. 자신의 언어를 쓰지 않고서는 "자신의 언어를 작성할 수 없습니다". .NET의 경우에는 개체 언어가 개별 언어가 아니라 CLR에 의해 정의되기 때문에 충분하지 않습니다. 문자 그대로 .NET 프레임 워크 자체의 일부 여야하거나 존재하지 않는 것입니다.