문제

할 수 있습니 인터페이스를 지정할 때 나는 선 회원으로 가입되어 있다고 합니다.

후에 사고에 대해 이 질문에 대한하는 동안,그것은 나에게 발생하는 정적 오리-입력한 언어할 수 있습니다.할 수 없는 이유는 미리 정의된 클래스로 수밖에 없는 인터페이스에서 컴파일한 시간입니까?예제:

public interface IMyInterface
{
  public void MyMethod();
}

public class MyClass  //Does not explicitly implement IMyInterface
{
  public void MyMethod()  //But contains a compatible method definition
  {
    Console.WriteLine("Hello, world!");
  }
}

...

public void CallMyMethod(IMyInterface m)
{
  m.MyMethod();
}

...

MyClass obj = new MyClass();
CallMyMethod(obj);     // Automatically recognize that MyClass "fits" 
                       // MyInterface, and force a type-cast.

당신의 언어로 지원하는 이러한 기능이?는 것이 좋겠는가에 자바나 C#?그것은 근본적으로 결함에 몇 가지 방법이 있을까?내가 이해할 수 있는 서브 클래스 MyClass 및 인터페이스를 구현하거나 사용하여 어댑터 디자인 패턴은 같은 일을 수행하는,그러나 그 방법 그냥 같이 보이는 불필요한 보일러 코드입니다.

도움이 되었습니까?

해결책

정의에 따라 정적으로 유형 된 언어는 확인 유형을 확인합니다 시간을 컴파일하십시오, 아니다 런타임. 위에서 설명한 시스템의 명백한 문제 중 하나는 컴파일러가 프로그램이 런타임이 아닌 컴파일 될 때 유형을 확인한다는 것입니다.

이제 컴파일러에 더 많은 인텔리전스를 구축하여 파생 프로그래머를 명시 적으로 갖지 않고 유형 선언하다 유형; 컴파일러는 그것을 볼 수 있습니다 MyClass 구현 a MyMethod() 방법,이 케이스를 그에 따라 처리합니다. 없이 명시 적으로 인터페이스를 선언해야합니다 (제안대로). 이러한 컴파일러는 다음과 같은 유형 추론을 활용할 수 있습니다. Hindley-Milner.

물론 Haskell과 같은 정적으로 입력 한 일부 언어는 이미 무언가를하고 있습니다. 비슷한 당신이 제안한 것에; Haskell 컴파일러는 명시 적으로 선언 할 필요없이 유형 (대부분)을 추론 할 수 있습니다. 그러나 분명히 Java/C#에는이 능력이 없습니다.

다른 팁

이 질문에 대한 새로운 답변, Go는이 기능이 정확히 있습니다. 나는 그것이 정말로 시원하고 영리하다고 생각합니다.

문서화 된대로 공식 문서에서 (예제 코드와 함께 GO 투어의 일부로):

인터페이스는 암시 적으로 구현됩니다

유형은 메소드를 구현하여 인터페이스를 구현합니다. 의도에 대한 명시 적 선언은 없으며 "구현"키워드가 없습니다.

암시 적 인터페이스는 구현에서 인터페이스의 정의를 분리하고, 이는 사전 방해없이 모든 패키지에 나타날 수 있습니다.

C ++에서 템플릿을 사용하는 것은 어떻습니까?

class IMyInterface  // Inheritance from this is optional
{
public:
  virtual void MyMethod() = 0;
}

class MyClass  // Does not explicitly implement IMyInterface
{
public:
  void MyMethod()  // But contains a compatible method definition
  {
    std::cout << "Hello, world!" "\n";
  }
}

template<typename MyInterface>
void CallMyMethod(MyInterface& m)
{
  m.MyMethod();  // instantiation succeeds iff MyInterface has MyMethod
}

MyClass obj;
CallMyMethod(obj);     // Automatically generate code with MyClass as 
                       // MyInterface

나는 실제로이 코드를 컴파일하지는 않았지만, 그것이 제안 된 (그러나 비공식적) 코드의 실행 가능하고 사소한 C ++ -Ization이라고 생각합니다.

요점이 보이지 않습니다. 클래스가 인터페이스를 구현하고이를 수행했다는 것을 명시하지 않겠습니까? 인터페이스를 구현하는 것은 다른 프로그래머 에게이 클래스가 인터페이스가 정의하는 방식으로 행동해야한다고 알려줍니다. 메소드에 동일한 이름과 서명을 갖는 것만으로도 디자이너의 의도가 메소드와 유사한 동작을 수행하는 것이 보장되지 않습니다. 그럴 수도 있지만 왜 해석을 위해 그것을 남겨두고 오용합니까?

역동적 인 언어로 성공적으로 "도망 갈 수있는"이유는 언어 자체보다 TDD와 더 관련이 있습니다. 제 생각에, 언어가 시설을 제공 할 수있는 시설을 제공하는 경우 코드를 사용하거나 보는 다른 사람들에게 이런 종류의 지침을 제공하는 경우 사용해야합니다. 실제로 명확성을 향상시키고 몇 가지 추가 캐릭터의 가치가 있습니다. 이 작업을 수행 할 수없는 경우 어댑터는 인터페이스가 다른 클래스와 어떻게 관련되는지 명시 적으로 선언하는 것과 동일한 목적을 제공합니다.

F#은 캐치와 함께 정적 오리 타이핑을 지원합니다. 회원 제약 조건을 사용해야합니다. 자세한 내용은 이에 제공됩니다 블로그 항목.

인용 블로그의 예 :

let inline speak (a: ^a) =
    let x = (^a : (member speak: unit -> string) (a))
    printfn "It said: %s" x
    let y = (^a : (member talk: unit -> string) (a))
    printfn "Then it said %s" y

type duck() =
    member x.speak() = "quack"
    member x.talk() = "quackity quack"
type dog() =
    member x.speak() = "woof"
    member x.talk() = "arrrr"

let x = new duck()
let y = new dog()
speak x
speak y

ML 가족 지원의 대부분의 언어 추론 및 제한된 유형 체계가있는 구조 유형, 이것은 괴짜 언어 디자이너 용어입니다. 원래 질문에서 "정적 오리 타자"라는 문구가 의미하는 것 같습니다.

이 가족의 가장 인기있는 언어는 Haskell, Objective Caml, F# 및 Scala를 포함합니다. 물론 당신의 예와 가장 밀접하게 일치하는 것은 객관적인 CAML 일 것입니다. 예제의 번역은 다음과 같습니다.

open Printf

class type iMyInterface = object
  method myMethod: unit
end

class myClass = object
  method myMethod = printf "Hello, world!"
end

let callMyMethod: #iMyInterface -> unit = fun m -> m#myMethod

let myClass = new myClass

callMyMethod myClass

참고 : 사용한 이름 중 일부는 OCAML의 식별자 케이스 의미론 개념을 준수하도록 변경해야하지만 그렇지 않으면 매우 간단한 번역입니다.

또한 주목할 가치가 있습니다. callMyMethod 기능이나 정의 iMyInterface 수업 유형이 엄격하게 필요합니다. 객관적인 CAML은 유형의 선언없이 예제의 모든 것을 유추 할 수 있습니다.

타임 스크립트!

글쎄, 좋아 ... 그래서 그것은 JavaScript 슈퍼 세트이며 아마도 "언어"를 구성하지는 않지만 이런 종류의 정적 오리 타자는 TypeScript에서 필수적입니다.

enter image description here

부 확실히 정적 오리-입력한 언어: http://boo.codehaus.org/Duck+Typing

발췌:

부 정적으로 입력한 언어 다음과 같 Java 또는 C#.즉 당신의 boo 응용 프로그램을 실행에 대한 한 빨리 사람들로 코딩 기타 정적으로 입력 언어습니다.NET 또는 모노.그러나 사용 정적으로 입력 언어로 제약 당신은 유연성과 자세한 코딩,스타일 때로는 필요한 종류 선언 (다음과 같"x int"하지만 이것은 종종 필요로 인해 부의 유형 추정)하고 때로는 필요 입력 캐스트(보 주물 형식).부 s 에 대한 지원 유형을 추정하고 결국 제네릭 도 여기에,하지만...

때때로 그것은 적당하게 안전망에 의해 제공되는 정적 입력합니다.어쩌면 당신은 탐구하고 싶 API 지 않고에 대해서 너무 걱정 메서드 서명 또는 어쩌면 당신 코드를 만드는 것 외부 구성 요소와 같은 COM 체입니다.나 방법의 선택은 당신이어야지 내입니다.

와 함께 정상적인 유형 체,int,string...부가 특별한 형식"이라고 duck".용어 에서 영감을 루비 프로그래밍 언어의 오리 입력하는 기능("만약 그것이 와 같이 안내 오리와 같이 돌팔이 의사 오리해야합니다,오리").

C ++의 새로운 버전은 정적 오리 타이핑 방향으로 움직입니다. 언젠가 (오늘?)와 같은 것을 쓸 수 있습니다.

auto plus(auto x, auto y){
    return x+y;
}

그리고 일치하는 함수 호출이 없으면 컴파일하지 못할 것입니다. x+y.

당신의 비판은 :

새로운 "CallmyMethod"가 전달되는 각 유형마다 생성되므로 실제로 유형의 추론이 아닙니다.

그러나 그것은 유형의 추론입니다 (당신은 말할 수 있습니다 foo(bar) 어디 foo 템플릿 함수), 시간 효율적이고 컴파일 된 코드에서 더 많은 공간을 차지하는 것을 제외하고는 동일한 효과가 있습니다.

그렇지 않으면 런타임 중에 메소드를 찾아야합니다. 이름을 찾은 다음 이름에 올바른 매개 변수가있는 메소드가 있는지 확인해야합니다.

또는 일치하는 인터페이스에 대한 모든 정보를 저장하고 인터페이스와 일치하는 모든 클래스를 조사한 다음 해당 인터페이스를 자동으로 추가해야합니다.

두 경우 모두, 이는 클래스 계층 구조를 암시적이고 실수로 깨뜨릴 수 있습니다. 이는 C#/Java의 프로그래머의 습관에 위배되기 때문에 새로운 기능에 좋지 않습니다. C ++ 템플릿을 사용하면 이미 지뢰밭에 있다는 것을 이미 알고 있습니다 (또한 템플릿 매개 변수에 제한을 허용하기 위해 기능 ( "개념")을 추가하고 있습니다).

Scala의 구조적 유형은 다음과 같은 일을합니다.

보다 스칼라에서 정적으로 "오리 타이핑"을 확인했습니다

Visual Basic 9의 사전 릴리스 설계는 동적 인터페이스를 사용하여 정적 오리 타이핑을 지원했지만 기능을 자릅니다.* 정시에 배송하기 위해.

D (http://dlang.org)는 정적으로 편집 된 언어이며 wrap () 및 unprap ()을 통해 오리 타자를 제공합니다.http://dlang.org/phobos-prerelease/std_typecons.html#.unwrap).

결정 정적으로 오리 타자 언어입니다. 예시:

def add(x, y)
  x + y
end

add(true, false)

전화 add 이 컴파일 오류를 일으 킵니다.

Error in foo.cr:6: instantiating 'add(Bool, Bool)'

add(true, false)
^~~

in foo.cr:2: undefined method '+' for Bool

  x + y
    ^

내 프로그래밍 언어의 최신 버전에서 헤론 그것은 구조적 서브 강요 연산자를 통해 비슷한 것을 지원합니다. as. 그래서 대신 :

MyClass obj = new MyClass();
CallMyMethod(obj);

당신은 다음을 쓸 것입니다 :

MyClass obj = new MyClass();
CallMyMethod(obj as IMyInterface);

예제에서와 마찬가지로이 경우 MyClass 명시 적으로 구현할 필요가 없습니다 IMyInterface, 그러나 만일 그것이 캐스트가 암시 적으로 일어날 수 있다면 as 운영자는 생략 할 수 있습니다.

나는 명시 적 구조적 하위 유형이라고 부르는 기술에 대해 조금 더 썼습니다. 이 기사.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top