2011년 6월 2일 목요일

Inheritance and Messages

Inheritance and Messages

상속을 통해, 어떤 클래스를 좀 더 세밀하게 만들거나 특수화할 수 있다. 쥬크박스용 노래에서 가사지원이 필요한 노래방용 노래를 만들어보자

class KaraokeSong < Song
 def initialize(name, artist, duration, lyrics)
super(name, artist, duration)
@lyrics = lyrics
 end
end

aSong = KaraokeSong.new("My Way", "Sinatra", 225, "And now, the...")  
puts aSong.to_s

>> Song: My Way--Sinatra (225)

"<Song"은 KaraokeSong이 Song의 하위 클래스임을 선언한 것이다. 즉 Song과 상속 관계를 정의한 것이다.
자식은 부모의 모든 속성을 상속 받기 때문에 to_s 메서드를 호출했을때 Song에서 정의한 to_s 메서드가 실행된다. 상속 관계가 있는 클래스에서 메서드를 실행하면 하위에서 상위로 올라가면서 해당 메서드를 검색하게 된다. 만일 KaraokeSong에서 to_s 메서드를 재정의한다면 Song의 to_s는 호출되지 않을 것이다.

class KaraokeSong < Song
 def initialize(name, artist, duration, lyrics)
super(name, artist, duration)
@lyrics = lyrics
 end
 
 def to_s  
"KS: #{@name}--#{@artist} (#{@duration}) [#{@lyrics}]"  
 end
end

aSong = KaraokeSong.new("My Way", "Sinatra", 225, "And now, the...")  
puts aSong.to_s

>> KS: My Way--Sinatra (225) [And now, the...]

위의 to_s 코드를 보면 하위에서 부모의 인스턴스 변수에 직접 접근 하였다. 이런 방식은 부모 클래스와 커플링이 발생하기 때문에 좋은 방식이 아니다.  부모의 내부 구조를 뒤지고, 명시적으로 부모의 인스턴스 변수에 접근 하는 거은 자식 클래스가 부모의 구현에 너무 매이게 되는 결과를 낳는다. 아래와 같이 작성하여야 한다.
class KaraokeSong < Song
 # Format ourselves as a string by appending
 # our lyrics to our parent's #to_s value.
 def to_s
   super + " [#{@lyrics}]"
 end
end



Song 클래스를 생성할 때 부모 클래스를 정의하지 않았지만 기본적으로 Object 클래스를 상속 받게 되어 있다. Object 클래스에는 to_s 메서드를 비롯 35개가 넘는 메서드가 정의되어 있다.

댓글 없음:

댓글 쓰기

블록체인 개요 및 오픈소스 동향

블록체인(block chain) 블록체인은 공공 거래장부이며 가상 화폐로 거래할때 발생할때 발생할 수 있는 해킹을 막는 기술. 분산 데이터베이스의 한 형태로, 지속적으로 성장하는 데이터 기록 리스트로서 분산 노드의 운영자에 의한 임의 조작이 불가...