하위 클래스로 재정의 할 수 있지만 콜백으로 사용할 수있는 메소드로 클래스를 만들고 싶습니다. 하나 또는 다른 상황에서만 원하는 동작을 얻을 수있는 것 같습니다. 다음은 예입니다 :어떻게 메소드를 오버라이드하고 coffeescript에서 콜백으로 사용할 수 있습니까?
class Parent
constructor:() ->
@foo = "foo"
fooNotAlwaysDefined:() ->
console.log("In parent.fooNotAlwaysDefined, @foo:#{@foo}")
childNotCalled:() =>
console.log("In parent.childNotCalled, @foo:#{@foo}")
class Child extends Parent
fooNotAlwaysDefined:() ->
console.log("In child.fooNotAlwaysDefined, @foo:#{@foo}")
childNotCalled:() ->
console.log("In child.childNotCalled, @foo:#{@foo}")
c = new Child()
c.fooNotAlwaysDefined()
c.childNotCalled()
process.nextTick(c.fooNotAlwaysDefined)
process.nextTick(c.childNotCalled)
자식 함수를 호출하고 @foo 모두 사용의 범위에 있어야 할 내가 원하는 것은 (C 콜백 등.). 여기에 출력 내가 얻을 것 :
child.fooNotAlwaysDefined, @foo에서 : foo는
parent.childNotCalled에서, @foo : foo는
child.fooNotAlwaysDefined에서, @foo : 정의되지 않은
parent.childNotCalled, @foo에서: 푸
내가 찾은 가장 좋은 해결 방법은 내가 익명 FUNC 내부 fooNotAlwaysDefined을 포장 할 수 있다는 것입니다 process.nextTick에 주어진 것이지만 그 이상은 아닙니다. child.fooNotAlwaysDefined, @foo에서
process.nextTick(() -> c.fooNotAlwaysDefined())
: foo는
은 내가 원하는 동작을 얻을 수 있도록 수업을 구성하는 방법이 있나요?
EDIT : Answer : 아래의 매우 유용한 설명을 요약하면 childNotCalled와 관련된 동작이 버그라는 것입니다. 이 동작이 1.6.1에서 발생한다는 것을 알 수 있으므로 개선되었을 수도 있지만이 문제는 해결되지 않습니다.
두 번째 편집 : 문제는 완전히 1.6.2에서 해결 된 것 같습니다.
을, 자식 방법으로 지방 화살표를 사용하는 것입니다 *하지 * 작동합니다. 부모 생성자는 자식 생성자 다음에 * 호출됩니다. 즉, 부모 메서드는 궁극적으로 바인딩되어 개체에 저장됩니다. – cspotcode
@cspotcode 와우, 네가 맞아. 나는 커피 스크립트가 합리적인 일을한다고 생각했습니다. 내 엉덩이. 이 동작을 CoffeeScript 컴파일러의 버그로 간주하지 않는 이유가 있습니까? 말하자면,이 행동이 바람직한 시나리오가 있습니까? –
@cspotcode이 버그는 1.6.0에서 소개되었지만 1.6.1에서 수정 된 것이 아닌 것으로 보이며 다음 릴리스에서 제대로 수정 될 것입니다. 휴. https://github.com/jashkenas/coffee-script/issues/2781 –