2009-08-30 5 views
0

clone() 메서드를 구현하려면 클래스가 필요한 인터페이스를 작성하고 있습니다. 다른인터페이스에 지정된 복제 메서드를 입력합니다.

public interface ISolvableGame { 
    function clone():ISolvableGame; 
    //... 
} 

:이 내 순진한 접근 방식은 다음과 같은 라인을 따라 갔다

내가 MyGame.clone()이 ISolvableGame를 구현하는 클래스의 인스턴스를 반환하기 때문에 서명의이 종류의 법적 될 것이라고 생각했다
public class MyGame implements ISolvableGame { 
    public function clone():MyGame { 
     // ... 
    } 
} 

이것은 인터페이스에서 계약을 만족시키는 것으로 보인다. 그러나 위의 코드는 MyGame.clone()이 인터페이스에 지정된 서명과 다른 서명을 가지고 있다는 사실을 참조하여 컴파일 오류를 생성합니다.

내 질문은 구현 된 메소드가 인터페이스의 서명과 정확히 일치해야한다면 어떻게하면 복제 메소드가 필요한 인터페이스를 만들 수 있습니까? 분명히 인터페이스를보다 구체적으로 만드는 것은 의미가 없습니다. 그러나 구현 된 메소드의 구체성을 덜 구체화 한 경우 (즉, MyGame.clone()ISolvableGame으로 반환하면) 해당 클론 메소드의 다른 사용자는 더 이상 얻지 못한 것을 알 수 있습니다.

두 가지 버전의 복제 방법이 필요합니다. 하나는 ISolvableGame으로 입력하고 다른 하나는 MyGame으로 입력하면됩니다. 아니면 더 나은 방법이 있습니까?


참고 : 나는, 액션합니다 (ECMA4 사양을 구현하는 자바와 같은 언어)에서 일하고 있어요. AS3은 인터페이스를 다루는 방식이 독특하지 않다는 가정하에 이것을 언어에 구애받지 않는다고 태그했습니다. 그러나 위의 샘플 코드가 다른 언어로 작동한다면 문제는 제 언어에만 해당 될 수 있습니다.


업데이트 : 그것은이 내 언어 거래의 방법 핵심 라이브러리를 검사하는 나에게 발생했습니다. 예를 들어, IEventDispatcher 인터페이스가 있습니다.이 인터페이스는 dispatch():Event 메서드를 정의합니다. 하위 클래스Event 인 모든 클래스는 궁극적으로 내 문제와 비슷합니다. IEventDispatcher을 구현할 수 없습니다.

라이브러리 대신 IEventDispatcher을 구현하기위한 목적으로 존재하는 클래스 EventDispatcher에서을 상속 같은 클래스를함으로써이 다루는 핵심. 따라서 컴파일 타임 형 안전성을 얻지 만, 처음에는 인터페이스를 사용하는 지점을 희석시키는 대신 일반적으로 상속으로 인한 문제를 피하기 위해 인터페이스를 선호하기 때문에.내 선택은

내가 생각하고있는 것을 : 핵심 라이브러리 프레데릭 설명으로

  • 이 두 가지 방법을 구현하는 것처럼

    • 다른 이름
    • 희생 컴파일 타임 유형, 상속에 궁극적으로 의존 제임스 안전에 대해 설명

    답 : 결국, 나는 인터페이스가 cloneToSolvable 메소드를 지정하도록하는 옵션을 가지고 갔다. 즉, 인터페이스는 인터페이스 타입에 복제 할 메소드를 지정하고, 클래스를 구현하기 위해서는 더 구체적으로 유형이 지정된 복제 메소드 이외에 메소드가 있어야한다. 이있을 수 있습니다. 이것은 나에게 옵션의 가장 불쾌한 것 같았다.

  • 답변

    1

    AS3에서는 오버라이드 (반환 유형 또는 매개 변수 유형으로 구분 된 동일한 이름을 가진 둘 이상의 함수) 만 재정의 (하위 클래스가 기본 클래스 구현을 대체 할 수 있음)를 허용하지 않습니다.

    function foo():int {} 
    function foo():String {} 
    function foo(a:String):void {} 
    

    ActionScript의 오버로드는 foo이며 ActionScript에서는이 작업을 수행 할 수 없습니다. 인터페이스는 사용자가 인터페이스를 "상속"한다는 점에서 오버로드보다 오버 라이드에 더 가깝습니다.

    // in your specific case you couldn't have these two functions 
    // defined within the same scope 
    public function clone():MyGame {} 
    public function clone():ISolvableGame {} 
    

    두 가지 개념을 혼용하려고합니다. 오버라이드하려는 인터페이스에 과부하를 걸기를 원합니다. Fredrik의 게시물에서 볼 수 있듯이 오버로드를 지원하는 언어 (AS3는 하나가 아닌)에서조차도 동시에 두 가지를 동시에 수행 할 수 없습니다. 인터페이스는 정확한 서명이있는 함수를 갖도록합니다. clone():MyGame

    유형 안전을 찾고 있다면 컴파일 할 때 얻을 수는 없지만 다음과 같이 할 수 있습니다. 호출자에서 반환 유형을 확인하면 런타임에 가져옵니다.

    // this will throw if clone does not return an 
    // object that is cast-able to MyGame 
    var game:MyGame = MyGame(someObj.clone()); 
    

    너무 MyGame 내 계약을 시행 할 수있는 선호하지만 난 방법을 알고있는 방법은 없습니다.

    +0

    의견을 보내 주셔서 감사합니다. 내 업데이트를보고 제 요약 내용에 동의하는 경우 알려 주시기 바랍니다. – fenomas

    1

    나는 액션과 경험이 없기 때문에이 또는 실행 가능한 솔루션을하지 않을 수 있지만, C#에서 나는 일반적으로 다음과 같이 수행

    public class MyGame : ISolvableGame { 
        public MyGame clone(){ 
         // ... 
        } 
    
        ISolvableGame ISolvableGame.clone() { 
         return this.clone(); 
        } 
    } 
    

    , 나는 "입력"복제 방법을 (반환 형식에 따라 다르므로 inteface를 구현하지 않습니다). 그런 다음 형식화 된 복제 메서드를 호출하고 결과를 반환하는 인터페이스 메서드를 명시 적으로 구현합니다. 이는 MyGameISolvableGame으로 전송할 수 있기 때문에 법적 절차입니다.

    +0

    두 메서드에 고유 한 이름이 있으면이 작업을 수행 할 수 있지만 불행히도 AS3에서는 이러한 오버로드를 허용하지 않으므로 호출자가 clone() 또는 cloneToISolvable()을 호출할지 여부를 알아야합니다. 일종의 불쾌한 일이다. 그래도 유일한 방법 일 수 있습니다. – fenomas

    0

    상속 된 복제 메소드는 항상 반환 유형으로 수퍼 클래스를가집니다. 예를 들어 모든 이벤트 클래스는 Event 개체를 반환하는 flash.events.Event 클래스의 복제 메서드를 재정의하고 해당 파생 클래스 개체를 반환하도록 구현합니다.

    관련 문제