GnuSmalltalkUsersGuide:BaseChapter 109
- Metaclass
Metaclass
네임스페이스 Smalltalk에 정의됨
슈퍼클래스: ClassDescription
범주: 언어-구현
- 나는 클래스 계층구조의 루트이다. 나의 인스턴스들은 메타클래스로, 각자가 실제 클래스의 메타클래스이다. 나의 인스턴스들은 단일 인스턴스를 갖고 있는데, 자신을 메타클래스로 하는 클래스를 하나씩 보유하는 셈이다. 나는 메타클래스 객체로부터 실제 클래스 객체를 생성하고, 나의 인스턴스에 해당하는 메타클래스 객체를 생성하기 위한 메서드를 제공한다. 이것은 당연히 혼란스럽다...스몰토크 메타클래스 시스템이 애초에 이상하고 복잡하기 때문이다.
Metaclass 클래스: 인스턴스 생성
subclassOf: superMeta
superMeta의 서브클래스를 표현하는 새 메타클래스를 응답하라.
Metaclass: 접근하기
instanceClass
메타클래스의 유일한 인스턴스를 응답하라.
primaryInstance
메타클래스의 유일한 인스턴스를 응답하라 - 호환성을 위해 존재한다.
soleInstance
메타클래스의 유일한 인스턴스를 응답하라 - 호환성을 위해 존재한다.
Metaclass: 기본
name: className environment: aNamespace subclassOf: theSuperclass
Private - 모든 특색을 가진 클래스를 생성하고 설치하거나, 슈퍼클래스 또는 기존 슈퍼클래스 모양을 변경하라; 인스턴스 변수명, 클래스 변수명, pool dictionary는 그대로 남겨둔다.
Private - 모든 특색을 가진 클래스를 생성하고 설치하거나, 기존 클래스를 변경하라.
name: newName environment: aNamespace subclassOf: theSuperclass instanceVariableNames: stringOfInstVarNames shape: shape classVariableNames: stringOfClassVarNames poolDictionaries: stringOfPoolNames category: categoryName
Private - 인스턴스와 클래스 변수를 파싱하고, pool dictionary를 파싱한 다음 클래스를 생성하라.
Private - 모든 특색을 가진 클래스를 생성하고 설치하라.
Metaclass: 메서드 컴파일하기
poolResolution
내 인스턴스의 poolResolution를 사용하라.
Metaclass: 위임
addClassVarName: aString
주어진 이름으로 된 클래스 변수를 클래스 pool dictionary로 추가하라.
주어진 공유 풀을 클래스의 pool dictionary 리스트로 추가하라.
allClassVarNames
수신자의 클래스 pool dictionary 내 변수명과 슈퍼클래스의 클래스 pool dictionary 각각에 있는 변수명을 응답하라.
메타클래스 내 메서드에서 볼 수 있는 공유 풀을 올바른 검색순으로 응답하라.
클래스와 그 슈퍼클래스가 정의한 공유 풀의 이름을 리턴하라.
category
클래스 범주를 응답하라.
classPool
클래스 pool dictionary를 응답하라.
classVarNames
클래스 pool dictionary 내 변수명을 응답하라.
comment
클래스 주석을 응답하라.
debuggerClass
인스턴스 클래스에 설정된 디버거 클래스를 응답하라.
environment
수신자가 구현된 네임스페이스를 응답하라.
name
클래스명을 응답하라 - 사실 이름이 없다.
pragmaHandlerFor: aSymbol
pragma aSymbol에 등록된 (어쩌면 상속된) 처리기를 응답하고, 찾을 수 없는 경우 nil을 응답하라.
removeClassVarName: aString
클래스로부터 클래스 변수를 제거하고, 찾을 수 없거나 여전히 사용 중인 경우 오류가 발생한다.
주어진 dictionary를 클래스의 pool dictionary 리스트로 제거하라.
클래스가 정의한 공유 풀의 이름을 리턴하라.
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'를 응답하라.