튜플은 다른 튜플을 확장할 수 있어요. TUPLE: child < parent slots ;는 인스턴스가 parent의 인스턴스이기도 한 클래스를 선언해요. 이런 인스턴스는 자신의 슬롯에 더해 부모의 슬롯도 가지고, 부모의 접근자도 자식에 정의된 것처럼 그대로 동작해요.
USING: accessors ;
TUPLE: animal name age ;
TUPLE: dog < animal breed ;
"Rex" 4 "labrador" dog boa .
! => T{ dog { name "Rex" } { age 4 } { breed "labrador" } }
"Rex" 4 "labrador" dog boa name>> . ! => "Rex" (inherited accessor)
boa 슬롯 순서boa 생성자는 슬롯을 선언 순서대로, 부모 먼저 받아요. 위의 dog의 경우에는 다음과 같아요:
dog boa ( name age breed -- dog )
weeks를 추가한 손자 puppy < dog 의 경우에는 다음과 같아요:
puppy boa ( name age breed weeks -- puppy )
모든 TUPLE: 선언은 프레디킷(name?)을 만들어요. 상속을 하면 프레디킷이 중첩돼서, 모든 자손이 조상의 프레디킷을 만족해요:
"Rex" 4 "labrador" dog boa
dup dog? . ! => t
dup animal? . ! => t
그 반대는 성립하지 않아요. dog가 아닌 animal은 dog?를 만족하지 못해요.
제네릭 메서드(M:, generics에서 배워요)도 계층을 따라 디스패치해요. 더 구체적인 오버라이드가 우선하지 않는 한, animal에 정의된 메서드는 모든 자손에 대해 실행돼요. 이 연습 문제 바로 다음에 나오는 boatswains-bilge에서 그것을 보게 될 거예요.
어떤 박물학자가 칼데라 주변에 사는 용들을 목록으로 정리하고 있어요. 용들은 서로 공통된 특징을 지니고 있어요. 모든 용에게는 이름, 색깔, 나이가 있죠. 하지만 각자만의 뚜렷한 방식으로 특화되어 있어요. 이제 용 클래스로 이루어진 작은 상속 트리와, 어떤 자손이든 나이를 먹이는 단어 하나를 만들 거예요.
튜플 클래스로 이루어진 상속 트리 전체를 먼저 정의해요(생성자는 뒤따르는 과제에서 만들어요).
dragon: name, color, age 슬롯을 가져요.fire-dragon: dragon의 하위 클래스로, flame-temp 슬롯을 추가해요.ice-dragon: dragon의 또 다른 하위 클래스로, chill-temp 슬롯을 추가해요.volcano-dragon: fire-dragon의 하위 클래스로, lava-volume 슬롯을 추가해요.그다음 dragon에 <dragon> 생성자를 만들어 줘요.
"Falkor" "white" 100 <dragon> name>> . ! => "Falkor"
fire-dragon에 <fire-dragon> 생성자를 만들어 줘요.
"Smaug" "red" 500 1200 <fire-dragon> flame-temp>> . ! => 1200
"Smaug" "red" 500 1200 <fire-dragon> dragon? . ! => t
ice-dragon에 <ice-dragon> 생성자를 만들어 줘요.
"Frosty" "blue" 200 -40 <ice-dragon> chill-temp>> . ! => -40
"Frosty" "blue" 200 -40 <ice-dragon> fire-dragon? . ! => f (siblings)
volcano-dragon에 <volcano-dragon> 생성자를 만들어 줘요.
"Vesuvius" "red" 1000 1500 99 <volcano-dragon> dragon? . ! => t
"Vesuvius" "red" 1000 1500 99 <volcano-dragon> fire-dragon? . ! => t
age-dragon을 정의해서, 어떤 용(또는 자손)이든 age 슬롯을 하나씩 증가시켜요. 반환하는 값은 없어요.
"Falkor" "white" 100 <dragon> dup age-dragon age>> . ! => 101
같은 단어가 모든 자손에서 동작해야 해요. 공유 접근자가 있는 이유가 바로 그거예요.
Exercism에 가입하고 Factor 트랙을 개념 47개연습 문제 163개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.