2011-05-11 7 views
2

this post에서 용감한 사람은 Base 유형의 객체를 Derived 유형으로 다운 캐스트하려고합니다 (C++에서). 파생 형식이 Base 이상의 특성을 가지고 있지 않다면 Derived 클래스가 제공하는 추가 메서드를 질투하는 경우 이 적합합니다.오브젝트의 신원을 바꿀 수있는 언어는 무엇입니까?

그런 것을 허용하는 프로그래밍 언어가 있습니까?

+2

메소드는 클래스가 아니라 속성을 정의합니다. –

답변

1

실제로 이것은 Common Lisp 및 CLOS (Common Lis Object System)가 이식 된 다른 Lisp 방언에서 문제없이 수행되는 것입니다. 이를 위해 change-class 일반 함수를 사용합니다.

CLOS는 여러 디스패치 메소드와 작동하므로 클래스 또는 객체에 연결되지 않은 메소드는 비슷한 함수 WRT 그룹에서 인수의 유형 (또는 ID)으로 선택된 함수입니다. change-class을 사용할 때 새 인스턴스를 작성하는 것처럼 인수를 제공 할 수 있으며 이미 오브젝트에 저장된 데이터는 그대로 유지됩니다. 이 기본 동작이 충분하지 않으면

CL-USER> (defclass base() 
     ((name :initarg :name))) 
#<STANDARD-CLASS BASE> 
CL-USER> (defclass derived (base) 
     ((age :initarg :age :initform 0))) 
#<STANDARD-CLASS DERIVED> 
CL-USER> (defvar foo (make-instance 'base :name "John Doe")) 
FOO 
CL-USER> (change-class foo 'derived :age 27) 
#<DERIVED {100338F2D1}> 
CL-USER> (with-slots (name age) foo 
     (list name age)) 
("John Doe" 27) 
CL-USER> (defvar bar (make-instance 'base :name "Baby Joe")) 
BAR 
CL-USER> (change-class bar 'derived) 
#<DERIVED {10036CF6E1}> 
CL-USER> (with-slots (name age) bar 
     (list name age)) 
("Baby Joe" 0) 
CL-USER> 

당신이 update-instance-for-different-class의 메소드를 정의 할 수 있습니다 : 여기 그것이 작동하는 방법을 보여줍니다 약간의 세션입니다.

그래, 그런 것들을 허용 프로그래밍 언어가!

+0

감사합니다! – CharlesB

+0

만약 당신이 Lisp이 할 수있는 것을보고 싶다면, 두 가지 놀라운 자원이 있습니다. 좀 더 실용적인 것을 원한다면, Peter Seibel (http://gigamonkeys.com/book/)의 Practical Common Lisp에 가보십시오. 적어도 수학에 능숙하고 조금이라도 성격이 깊어지기를 원한다면 컴퓨터 프로그래밍, 시도 SICP (http://mitpress.mit.edu/sicp/ 물론 동영상 http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussman-lectures/) –

1

아니요.하지만 처음부터 그렇게하는 것이 강한 코드 냄새입니다.

더 나은 대안은 decorator pattern을 사용하는 것입니다. 이것이 정확하게 만들어진 것입니다.

+0

"내가 싫어"라고 말하고 싶을 때 "아니오"라고 대답하지 마십시오. 특히 "아니오"가 실제로 잘못되었을 때 ... –

0

Derived에 속성이없는 경우 추가하는 메소드는 Base에서 가져온 상태에서 작동해야합니다. 이 경우 해당 메소드가 속한 Base으로 이동하지 않는 이유는 무엇입니까?

+0

질문에 대한 @Albus 코멘트 때문입니다. 속성은 클래스를 정의하지 않으며, 클래스는 다른 메소드와 다른 신원/기능을가집니다. – CharlesB

+1

이것은 하스켈에서 타입 클래스의 개념이다. 동일한 객체가 각 클래스의 기능을 구현하는 경우 다른 유형의 클래스에있을 수 있습니다 ... –