2011-09-26 2 views
1

하위 클래스의 보호 된 함수를 재정의했습니다.Actionscript Duck-typing

두 가지 클래스 인 Apple 및 Fruit이 있다고 가정 해 보겠습니다. 모든 변수가 있습니다. 이것은 단순화 된 버전입니다.

class FruitBasket 
    protected function getRandom():Fruit 
    { 
     // return random piece of fruit 
    } 

class AppleBasket extends FruitBasket 
    protected override function getRandom():Apple 
    { 
     // return random apple 
    } 

class Fruit 

class Apple extends Fruit 

예는 사소한 것입니다. 문제는 getRandom 함수의 유형이 자체 유형에 의존한다는 것입니다. 하나는 사과를 반환하고, 다른 하나는 과일을 반환합니다. 물론 오버라이드와 강요에 대한 오류가 발생합니다.

Apple 대신 과일을 반환하려고 시도했지만 객체가 사과가 아니므로 Apple 고유의 속성이 없습니다. 문제는 ducktyping입니다. 변경할 수없는 세 번째 클래스가 있습니다. 각 객체에서 getRandom() 함수를 실행하고, 약간 다른 사과가 필요합니다.

Apple에서 getRandom 함수를 재정의하여 과일 대신 사과를 반환하도록하려면 어떻게해야합니까?

답변

0

이것은 circle-ellipse problem입니다. 나는 단순히 함수를 재정의 (override)하지 않을 것이다. 오히려 좀 더 구체적으로 함수의 이름을 바꿉니다. AppleBasket에서 getRandomApple()으로 이름을 변경하십시오. 당신의 의미가 조금 진흙 투성이가되어서 일을 분리하고 명확하게 만들 것입니다.

FruitBasket에서 함수 이름을 변경할 수 없기 때문에 getRandomFruit()으로 변경하여 의미를 더 명확하게 했으므로 함수 이름을 변경할 수 없습니다.

+0

죄송합니다. 첫 번째 게시물을 변경했습니다. FruitBasket이 변경 될 수없는 클래스라고 가정 해 보겠습니다. 그것은 라이브러리의 일부이며, 그것을 변경하는 대신 AppleBasket의 하위 클래스 인 AppleBasket을 만들었습니다. 분명히 Fruits보다는 Apple을 만듭니다. 이제이 FruitBasket은 내가 변경할 수없는 다른 클래스에 포함됩니다. – flappy

+0

오, 무슨 일이 일어나고 있는지 보여줍니다. 이것은 내 대답을 바꿉니다. – jhocking

+0

Fruit과 함께 작동하는 HiddenClass를 편집 할 수없는 또 다른 클래스가 있습니다. 그리고 나서 HiddenClass 등을 사용하는 또 다른 클래스 나는 더 많은 지정된 것들을 포함 할 수 있도록 계층 구조의 모든 클래스에 대해 새로운 클래스를 생성함으로써 현재이 문제를 해결했습니다. 내가 가장 좋아하는 솔루션은 아니지만 작동합니다. – flappy

0

AS3의 오리 타이핑과 동일한 것은 "*"또는 "오브젝트"유형입니다.