왜 프로그래밍 언어가 리턴 유형에 관계없이 메소드 서명을 생성합니까?


11

반환 유형을 기반으로 메소드 서명을 생성하지 않는 많은 언어로 작업했습니다. 나는 또한 하나 (어쩌면 일부입니까?)와 함께 일했습니다. 과거에 나에게 문제를주지 않은 사람들 (예 : 여기 ). 왜 프로그래밍 언어가 리턴 유형에 관계없이 메소드 서명을 생성합니까?

업데이트 : 나는 정적으로 유형이 컴파일 된 언어를 특별히 언급하고 있습니다.


이것은 근거가없는 추측이지만 컴파일러 구현 및 / 또는 도구 지원의 어려움과 관련이 있다고 생각합니다.
Charles Lambert

Haskell에서는 타입 클래스를 사용하여 기본적으로 리턴 타입에 의존하는 함수를 만들 수 있습니다. I <3 Haskell : D : D : D
Thomas Eding

답변:


5

타입 캐스팅 및 타입 계층 구조와 잘 맞지 않습니다. 두 가지 버전의 메소드가있는 경우 (하나는 유형 A를 리턴하고 다른 하나는 유형 B를 리턴 함) 다음과 같은 경우에 문제가 발생합니다.

  • A 또는 B는 서로의 서브 타입이며 리턴 값을 수퍼 타입 ​​인 것으로 지정합니다.
  • A와 B에는 공통 수퍼 타입이 있으며 이러한 수퍼 타입 ​​값에 지정합니다.

캐스트 로이 문제를 해결할 수는 있지만 함수 중 하나의 이름을 바꾸는 것만 큼 많은 타이핑이 필요합니다. 호출이 모호 할 때 컴파일러 오류를 등록 할 수도 있습니다.이 경우 사용자는 비슷한 노력을 기울여야합니다.


1
서명에 반환 유형을 포함하는 언어로 작업했습니다. 표시 한대로 모든 장소에 전송하는 것은 문제가되지 않습니다. 구체적인 예에서는 캐스트 로이 문제를 해결할 필요가 없습니다. A와 B (C의 하위 유형)가 모두 동일한 작업을 갖는 경우 C로 선언해야합니다. 반환 유형이 B의 유형과 다른 경우 : 대부분의 경우 C의 하위 유형을 반환하려고합니다. 하위 유형에 하위 유형을 리턴하는 다른 메소드를 추가하고 C의 버전을 구현하여 특정 하위 유형의 메소드를 호출하십시오. 이제 모든 장소에 캐스트 할 필요가 없습니다.
Charles Lambert

@Charles Lambert : 클래스 A, B 또는 C에 대한 작업이 아닙니다. 이름과 매개 변수 목록이 동일한 두 함수입니다. 하나는 A 유형의 무언가를 반환하고 다른 하나는 B 유형의 무언가를 반환합니다. 단순한 OOP 시스템 이상으로 일반 유형과 기능에 따라 대답했습니다. 또한, 귀하의 반박 사례가 무엇을 이루려는지 이해하지 못합니다. 이에 응답하려면 더 자세한 정보가 필요합니다.
jprete

설명이 너무 짧습니다. pastebin.com/JR39PKs0 기본적으로 서명에 리턴 유형을 포함하는 언어는 설명중인 문제점을 완화하는 방법을 이미 제시했습니다. 코딩 컨벤션이거나 표준 연습입니다. 또한, 작성하는 내용 중 많은 부분이 반환 유형 만 다른 메소드를 생성해야한다고 보장하지는 않습니다. 다시 말하지만, 당신은 이것을 자주 다루지 않을 것입니다
Charles Lambert

주어진 인수 시그니처에 대해 하나의 "기본"메소드 만 선언 할 수 있지만 임의의 수의 보조 메소드를 선언 할 수 있다는 규칙을 갖는 데 어려움이 있습니까? 기본 방법이 존재하고, 특정 방법으로 보조 방법을 검사하여 그러한 방법이 확실하게 더 나은 일치인지 확인하십시오 (또는 기본 방법이 아닌 경우에도 사용할 수 있습니까).
supercat

3

메소드를 호출하고 결과를 지정할 수 없기 때문입니다.


3
모든 언어가 아닙니다.
Jörg W Mittag

@Jorg 어떤 언어를 좋아합니까?
Chiron

1
f #은 하나의 언어입니다. 일반적으로 foo-> ignore가 무시되는 경우 ignore는 void와 비슷한 반환 유형의 단위를 사용하는 메소드입니다.
Charles Lambert

Ada가 더 좋은 예입니다. 해당 언어는 실제로 서명의 일부로 리턴 유형도 사용합니다.
Charles Lambert

-4

경험적 규칙 : 강력한 형식의 언어는 일반적으로 메서드 서명을 반환 형식에 바인딩합니다. 약한 유형의 언어는 그렇지 않습니다.
C #을 모르지만 C #이 제네릭을 처리하는 방식으로 인해 문제가 있다고 가정합니다. 일반적인 방법과는 완전히 다른 방법을 만들 수 있습니다.이 경우에는 실제로 두 가지 방법입니다.


1
이 강력한 형식의 언어 중 어떤 언어를 사용하는지 궁금합니다. 나는 아무것도 모른다 .C ++은 반환 유형에 대한 해상도를 명시 적으로 금지한다는 것을 알고있다.
greyfade

2
-1 위반 한 하나의 예에서 명백히 잘못된 규칙을 제시하려는 경우 규칙을 준수하는 다른 모든 예를 따라야합니다.

@ greyfade, 내 요점은 약한 유형의 언어에서는 할당시 할당이 확인되지 않는다는 것입니다. 동의하지 않을 수도 있습니다.
CMR

"강력한 유형의 언어는 일반적으로 반환 유형에 바인딩됩니다"라는 부정확 한 주장으로 인해 요점이 모호합니다.
greyfade
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.