programing

오버로드된 메서드에 대해 서로 다른 반품 유형을 가질 수 있습니까?

sourcejob 2023. 7. 8. 10:50
반응형

오버로드된 메서드에 대해 서로 다른 반품 유형을 가질 수 있습니까?

메서드 오버로드에서 오버로드된 메서드에 대해 서로 다른 반환 유형을 가질 수 있습니까?예를들면,

void foo(int x) ;
int foo(int x,int y);
double foo(String str);

일반적인 객체 지향 프로그래밍에서, 그것이 가능합니까?

클래스에는 동일한 이름을 공유하지만 다른 여러 메서드가 있을 수 있습니다.

  1. 매개 변수 유형
  2. 매개변수 수
  3. 메서드에 선언된 매개 변수의 순서

메서드에 제공된 매개 변수에 따라 런타임에 컴파일러는 실행할 메서드의 버전을 결정합니다.

오버로드된 메서드는 반환 유형이 다를 수도 있고 그렇지 않을 수도 있습니다.그러나 반환 형식만으로는 컴파일러가 런타임에 어떤 메서드를 실행할지 결정하기에 충분하지 않습니다.

메서드 오버로드는 같은 클래스에 서로 다른 인수를 가진 이름의 메서드가 둘 이상 있는 것을 의미합니다.메서드 오버로드의 이점은 동일한 의미 연산을 지원하지만 인수 번호나 유형에 따라 다른 메서드를 구현할 수 있다는 것입니다.

중요 사항

  • 오버로드된 메서드는 인수 목록을 변경해야 합니다.
  • 오버로드된 메서드는 반환 유형을 변경할 수 있습니다.
  • 오버로드된 메서드는 액세스 한정자를 변경할 수 있습니다.
  • 오버로드된 메서드는 선택한 예외를 새로 선언하거나 더 광범위하게 선언할 수 있습니다.
  • 메서드는 동일한 클래스 또는 하위 클래스에서 오버로드될 수 있습니다.

파라미터가 수 .return 형식입니다. 컴파일러throws error아래의 경우(중복 방법)입니다.

방법 1:

public int calc(int a, int b, int c)

방법 2:.

public String calc(int e, int f, int g)

발생한 오류:

method calc(int, int, int) is already defined

컴파일러가 어떤 메소드를 호출해야 하는지 알 수 없기 때문에 다른 반환 유형의 경우 메소드 오버로드가 불가능합니다.

정답은 NO입니다.

Integer doSomething(){return null;}
String doSomething(){return null;}

main(){
    doSomething()
}

이 경우 컴파일러는 어떤 메서드를 호출할지 알 수 없습니다.

참고 - 메서드 오버로드는 컴파일 시간 동안 확인됩니다.

이런 일을 하지 않는 한:

int foo (int i, int has_default=0);
double foo (long l);
/* Skipping to the function call.  */
foo (1);

당신은 괜찮을 겁니다.위의 코드는 두 함수 중 하나를 호출하려고 할 수 있기 때문에 문제를 일으킬 것입니다.만약 당신이 C++을 사용하고 있고, 당신이 원시적인 것이나 참조 대신 포인터를 반환한다면, 그것은 매우 나빠질 수 있습니다.

간단히 말해서, 반환 형식을 오버로드하려면 호출 결과에서 사용할 함수를 도출할 수 있는 강력한 타이핑 시스템이 필요합니다.

해스켈과 ML 가족은 이 일을 해낼 수 있습니다.

반환 형식을 변경하면 컴파일러가 사용할 함수를 도출할 수 있는 충분한 정보가 남기 때문에 args를 변경할 때 오버로드를 제한하도록 정의하는 것은 옳지 않습니다.

반환 유형별 함수 오버로드라는 이 멋진 답변을 확인해 보십시오.

간단히 말해서, 대부분의 정적으로 입력된 언어는 그렇지 않지만 일부 동적으로 입력된 언어는 그럴 수 있습니다.

편집: "요약" 답변은 반환 유형별로 엄격하게 오버로드에 적용됩니다.다른 사람들이 지적했듯이 매개 변수 목록이 다르고 컴파일러가 해결할 수 있는 경우 각 메서드가 다른 유형을 반환할 수 있습니다.반환 값을 무시할 수 없기 때문에 ADA에서 반환 형식으로만 메서드를 오버로드할 수 있으며 컴파일러는 이 정보를 사용하여 메서드 호출을 해결할 수 있습니다.

네, 당신이 준 예는 가능합니다. 우리는 c#에서 이런 방식으로 방법 오버로딩을 할 수 있습니다.

void foo(int x)
    {
    }
    int foo(int x, int y)
    {
        return 0;
    }
    double foo(String str)
    {
        return 1;
    }

오버로드에는 적합하지 않습니다.매개 변수 목록을 변경해야만 오버로드할 수 있습니다.반환 형식은 메서드 서명의 일부가 아니므로 반환 형식만 변경해도 메서드 오버로드에는 유효하지 않습니다(메소드 이름과 매개 변수 목록만 메서드 서명에 있음).

C++ Hear is 예제의 Varadic 템플릿 기능을 사용할 수 있습니다.

template<typename T>
T adder(T v) {
  return v;
}

template<typename T, typename... Args>
T adder(T first, Args... args) {
  return first + adder(args...);
}

여기 몇 가지 방법이 있습니다.

long sum = adder(1, 2, 3, 8, 7);

std::string s1 = "x", s2 = "aa", s3 = "bb", s4 = "yy";
std::string ssum = adder(s1, s2, s3, s4);

자세한 내용은 https://eli.thegreenplace.net/2014/variadic-templates-in-c/ 을 참조하십시오.

메서드 오버로드를 지원하는 대부분의 프로그래밍 언어(Java, C#, C++, ...)의 경우 매개 변수 유형이 다를 경우 반환 유형도 다를 수 있습니다.

네, 오버로드된 방법에서도 파라미터가 다를 경우 가능합니다.

그러나 매개 변수가 같고 반환 유형이 다른 두 가지 메소드가 있으면 컴파일러 오류가 발생합니다.반복: 오버로드된 메서드에 대해서는 반환 유형에 관계없이 서로 다른 매개 변수가 필수입니다.

언급URL : https://stackoverflow.com/questions/2807840/is-it-possible-to-have-different-return-types-for-a-overloaded-method

반응형