GnuSmalltalkUsersGuide:BaseChapter 109

From 흡혈양파의 번역工房
Jump to navigation Jump to search
Metaclass

Metaclass

네임스페이스 Smalltalk에 정의됨

슈퍼클래스: ClassDescription

범주: 언어-구현


나는 클래스 계층구조의 루트이다. 나의 인스턴스들은 메타클래스로, 각자가 실제 클래스의 메타클래스이다. 나의 인스턴스들은 단일 인스턴스를 갖고 있는데, 자신을 메타클래스로 하는 클래스를 하나씩 보유하는 셈이다. 나는 메타클래스 객체로부터 실제 클래스 객체를 생성하고, 나의 인스턴스에 해당하는 메타클래스 객체를 생성하기 위한 메서드를 제공한다. 이것은 당연히 혼란스럽다...스몰토크 메타클래스 시스템이 애초에 이상하고 복잡하기 때문이다.


Metaclass 클래스: 인스턴스 생성

subclassOf: superMeta

superMeta의 서브클래스를 표현하는 새 메타클래스를 응답하라.


Metaclass: 접근하기

instanceClass

메타클래스의 유일한 인스턴스를 응답하라.

primaryInstance

메타클래스의 유일한 인스턴스를 응답하라 - 호환성을 위해 존재한다.

soleInstance

메타클래스의 유일한 인스턴스를 응답하라 - 호환성을 위해 존재한다.


Metaclass: 기본

name: className environment: aNamespace subclassOf: theSuperclass

Private - 모든 특색을 가진 클래스를 생성하고 설치하거나, 슈퍼클래스 또는 기존 슈퍼클래스 모양을 변경하라; 인스턴스 변수명, 클래스 변수명, pool dictionary는 그대로 남겨둔다.

name: className environment: aNamespace subclassOf: newSuperclass instanceVariableArray: variableArray shape: shape classPool: classVarDict poolDictionaries: sharedPoolNames category: categoryName

Private - 모든 특색을 가진 클래스를 생성하고 설치하거나, 기존 클래스를 변경하라.

name: newName environment: aNamespace subclassOf: theSuperclass instanceVariableNames: stringOfInstVarNames shape: shape classVariableNames: stringOfClassVarNames poolDictionaries: stringOfPoolNames category: categoryName

Private - 인스턴스와 클래스 변수를 파싱하고, pool dictionary를 파싱한 다음 클래스를 생성하라.

newMeta: className environment: aNamespace subclassOf: theSuperclassinstanceVariableArray: arrayOfInstVarNames shape: shape classPool: classVarDict poolDictionaries: sharedPoolNames category: categoryName

Private - 모든 특색을 가진 클래스를 생성하고 설치하라.


Metaclass: 메서드 컴파일하기

poolResolution

내 인스턴스의 poolResolution를 사용하라.


Metaclass: 위임

addClassVarName: aString

주어진 이름으로 된 클래스 변수를 클래스 pool dictionary로 추가하라.

addSharedPool: aDictionary

주어진 공유 풀을 클래스의 pool dictionary 리스트로 추가하라.

allClassVarNames

수신자의 클래스 pool dictionary 내 변수명과 슈퍼클래스의 클래스 pool dictionary 각각에 있는 변수명을 응답하라.

allSharedPoolDictionariesDo: aBlock

메타클래스 내 메서드에서 볼 수 있는 공유 풀을 올바른 검색순으로 응답하라.

allSharedPools

클래스와 그 슈퍼클래스가 정의한 공유 풀의 이름을 리턴하라.

category

클래스 범주를 응답하라.

classPool

클래스 pool dictionary를 응답하라.

classVarNames

클래스 pool dictionary 내 변수명을 응답하라.

comment

클래스 주석을 응답하라.

debuggerClass

인스턴스 클래스에 설정된 디버거 클래스를 응답하라.

environment

수신자가 구현된 네임스페이스를 응답하라.

name

클래스명을 응답하라 - 사실 이름이 없다.

pragmaHandlerFor: aSymbol

pragma aSymbol에 등록된 (어쩌면 상속된) 처리기를 응답하고, 찾을 수 없는 경우 nil을 응답하라.

removeClassVarName: aString

클래스로부터 클래스 변수를 제거하고, 찾을 수 없거나 여전히 사용 중인 경우 오류가 발생한다.

removeSharedPool: aDictionary

주어진 dictionary를 클래스의 pool dictionary 리스트로 제거하라.

sharedPools

클래스가 정의한 공유 풀의 이름을 리턴하라.


Metaclass: 파일링하기

fileOutOn: aFileStream

완전한 클래스 설명을 file out하라: 클래스 정의, 클래스 및 인스턴스 메서드


Metaclass: 인쇄하기

nameIn: aNamespace

클래스가 aNamespace로부터 참조될 때 클래스명을 응답하라.

printOn: aStream

수신자의 표현을 aStream 상에 인쇄하라.

printOn: aStream in: aNamespace

클래스가 aNamespace로부터 참조될 때 클래스명을 aStream 상에 인쇄하라.

storeOn: aStream

수신자로 컴파일하는 스몰토크 코드를 aStream 상에 보관하라.


Metaclass: 기능 검사하기

asClass

'instanceClass'를 응답하라.

isMetaclass

항상 'true'를 응답하라.


Notes