this post에서 용감한 사람은 Base
유형의 객체를 Derived
유형으로 다운 캐스트하려고합니다 (C++에서). 파생 형식이 Base
이상의 특성을 가지고 있지 않다면 Derived
클래스가 제공하는 추가 메서드를 질투하는 경우 은이 적합합니다.오브젝트의 신원을 바꿀 수있는 언어는 무엇입니까?
그런 것을 허용하는 프로그래밍 언어가 있습니까?
this post에서 용감한 사람은 Base
유형의 객체를 Derived
유형으로 다운 캐스트하려고합니다 (C++에서). 파생 형식이 Base
이상의 특성을 가지고 있지 않다면 Derived
클래스가 제공하는 추가 메서드를 질투하는 경우 은이 적합합니다.오브젝트의 신원을 바꿀 수있는 언어는 무엇입니까?
그런 것을 허용하는 프로그래밍 언어가 있습니까?
실제로 이것은 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
의 메소드를 정의 할 수 있습니다 : 여기 그것이 작동하는 방법을 보여줍니다 약간의 세션입니다.
그래, 그런 것들을 허용 프로그래밍 언어가!
감사합니다! – CharlesB
만약 당신이 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/) –
아니요.하지만 처음부터 그렇게하는 것이 강한 코드 냄새입니다.
더 나은 대안은 decorator pattern을 사용하는 것입니다. 이것이 정확하게 만들어진 것입니다.
"내가 싫어"라고 말하고 싶을 때 "아니오"라고 대답하지 마십시오. 특히 "아니오"가 실제로 잘못되었을 때 ... –
Derived
에 속성이없는 경우 추가하는 메소드는 Base
에서 가져온 상태에서 작동해야합니다. 이 경우 해당 메소드가 속한 Base
으로 이동하지 않는 이유는 무엇입니까?
질문에 대한 @Albus 코멘트 때문입니다. 속성은 클래스를 정의하지 않으며, 클래스는 다른 메소드와 다른 신원/기능을가집니다. – CharlesB
이것은 하스켈에서 타입 클래스의 개념이다. 동일한 객체가 각 클래스의 기능을 구현하는 경우 다른 유형의 클래스에있을 수 있습니다 ... –
메소드는 클래스가 아니라 속성을 정의합니다. –