문제

나는 GOF 책을 읽고 있었고 프로토 타입 섹션의 시작 부분에서 나는 이것을 읽었다.

이 혜택은 주로 클래스를 일등석 객체로 취급하지 않는 C ++와 같은 언어에 적용됩니다.

나는 C ++를 사용한 적이 없지만 OO 프로그래밍에 대해 잘 이해하고 있지만, 이것은 실제로 나에게 의미가 없습니다. 누구든지 이것에 대해 자세히 설명 할 수 있습니까?

도움이 되었습니까?

해결책

클래스가 일등석 개체가 되려면 언어는 기능이 매개 변수로 클래스 (인스턴스가 아닌)를 수업을 수정하고 컨테이너에서 클래스를 보유하고 함수에서 클래스를 반환 할 수 있도록하는 것과 같은 작업을 지원해야합니다.

일등석 수업이있는 언어의 예는 Java를 고려하십시오. 모든 객체는 클래스의 인스턴스입니다. 그 수업 자체는 그 자체의 사례입니다 java.lang.class.

다른 팁

다른 사람들에게는 전체 인용문이 있습니다.

"감소 된 서브 클래싱. 공장 방법 (107)은 종종 제품 클래스 계층 구조와 유사한 Creator 클래스의 계층 구조를 생성합니다. 프로토 타입 패턴을 사용하면 공장 방법을 요청하는 대신 프로토 타입을 복제 할 수 있습니다. 따라서 새로운 개체를 만들 필요가 없습니다. Creator Class 계층 구조 전혀.이 혜택은 주로 클래스를 일류 개체로 취급하지 않는 C ++와 같은 언어에 적용됩니다. SmallTalk 및 Object C와 같은 언어는 항상 클래스 객체를 Creator. 클래스 객체는 이미 이러한 언어로 프로토 타입처럼 작동합니다. " -GOF, 120 페이지.

처럼 스티브가 그것을 넣습니다,

나는 / 인스턴스 /의 클래스가 C ++의 일류 객체가 취급되지 않는다는 것을 암시하는 것으로 이해했을 정도로 미묘하게 발견되었습니다. GOF가 사용하는 것과 동일한 단어가 덜 공식적인 설정으로 나타나면 클래스보다는 / 인스턴스 /가 아닌 의도 / 인스턴스 / 일 수 있습니다. 구별은 /당신에게 미묘하지 않은 것처럼 보일 수 있습니다. 그러나/I/는 그것을 생각해야했습니다.

나는 구별이 중요하다고 믿는다. 내가 착각하지 않은 경우, 컴파일 된 C ++ 프로그램 보존보다 요구 사항은 없다. IOW, Java 용어를 사용하려면 / 클래스 / 객체가 없습니다.

Java에서 모든 클래스는 Java.lang.class에서 파생 된 객체 자체로 프로그램 내에서 해당 클래스, 방법 등에 대한 정보에 액세스 할 수 있습니다. C ++는 그렇지 않습니다. 클래스 (객체와 반대로)는 실제로 런타임에 액세스 할 수 없습니다. RTTI (런타임 유형 정보)라는 시설이있어 해당 라인을 따라 몇 가지 작업을 수행 할 수 있지만 매우 제한적이며 성능 비용이 있다고 생각합니다.

일류 수업이있는 언어 인 Python을 사용했습니다. 클래스를 함수로 전달하고 목록 등에 저장할 수 있습니다. 아래 예제에서 New_Instance () 함수는 전달 된 클래스의 새 인스턴스를 반환합니다.

class Klass1:
    pass

class Klass2:
    pass

def new_instance(k):
    return k()

instance_k1 = new_instance(Klass1)
instance_k2 = new_instance(Klass2)

print type(instance_k1), instance_k1.__class__
print type(instance_k2), instance_k2.__class__

C# 및 Java 프로그램은 .NET 및 Java Runtimes가 모두 제공하기 때문에 자체 클래스를 알고 있습니다. 반사, 일반적으로 프로그램에 자체 구조에 대한 정보가 있습니다 (.NET 및 Java 에서이 구조는 클래스 측면에서 발생합니다).

프로그램은 자체적으로 인식 할 수 없기 때문에 런타임 환경에 의존하지 않고 반성을 감당할 수있는 방법이 없습니다. 그러나 프로그램 실행이 런타임에 의해 관리되는 경우 프로그램은 런타임에서 자체에 대한 정보를 가질 수 있습니다. C ++는 기본적이고 관리되지 않는 코드로 컴파일되므로 C ++ **에 반사를 감당할 수있는 방법은 없습니다.

...

* 글쎄, 프로그램이 자체 기계 코드를 읽을 수 없었고 그 자체에 대해 "결론을 내리려고"이유가 없습니다. 그러나 나는 그것이 아무도하고 싶은 일이라고 생각합니다.

** 엄격하게 정확하지 않습니다. 끔찍한 매크로 기반 해킹을 사용하면 클래스 계층에 단일 루트가있는 한 반사와 유사한 것을 달성 할 수 있습니다. MFC가 이것의 예입니다.

Template Metaprogramming은 C ++를 수업과 함께 플레이하는 더 많은 방법을 제공했지만 솔직히 말해서 현재 시스템이 사람들이 원하는 모든 운영 범위를 허용하지 않는다고 생각합니다 (주로, 이용 가능한 모든 방법을 발견 할 수있는 표준 방법은 없습니다. 클래스 또는 객체). 그것은 감독이 아니라 디자인에 의한 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top