2014-10-01 3 views
1

와 절차는이 클래스를 고려하십시오. 이 단순히 언어 제한이 가능이거나 (그리고 나는이 개 방법 중 하나의 이름을 바꿀 필요) : 슬프게도 델파이이 마음에 들지 않고, 컴파일러는 이러한 오류 barfs :클래스 함수/프로 시저 및 인스턴스 기능/같은 이름

[DCC Error] u_myclass.pas(9): E2252 Method 'Foo' with identical parameters already exists 
[DCC Error] u_myclass.pas(20): E2037 Declaration of 'Foo' differs from previous declaration 
[DCC Error] u_myclass.pas(9): E2065 Unsatisfied forward or external declaration: 'TMyClass.Foo' 

내 질문?

unit u_myclass; 

interface 

type 
    TMyClass = class 
    public 
    class function Foo(A : Integer) : Integer; overload; 
    function Foo : Integer; overload; 
    end; 

implementation 

{ TMyClass } 
class function TMyClass.Foo(A: Integer): Integer; 
begin 
Result := A; 
end; 

function TMyClass.Foo: Integer; 
begin 
Result := 1; 
end; 

end. 
+2

AFAIK이 작업은 불가능합니다. 컴파일러는 어떤 함수를 호출할지 알고 있어야합니까? 클래스 함수를 호출 할 때 분명 할 수도 있지만 인스턴스에서 호출 할 때가 아닙니다. –

+0

좋은 지적 Uwe, 그 이유가 있어야합니다 ... – whosrdaddy

+0

그냥 다른 이름을 사용하십시오. 달성하고자하는 것은 IMO가 함수 오버로딩을 악용하는 것입니다. 컴파일러가 그것을 허용하지 않는 것이 좋다. – kludg

답변

2

그것은 인스턴스 메소드와 클래스 메소드에 사용하는 동일한 이름을 부여 할 수 없습니다 :

+0

예, @UweRaabe는 이미 그것을 지적했습니다. 그냥 확신하고 싶었어 :) – whosrdaddy

2

내가 찾은 유일한 해결책은 과부하 및 다른 매개 변수를 사용하는 것입니다. 이것이 허용되지 않는 것은 컴파일러가 일부 시나리오에서 이들을 구별 할 수 없다는 것입니다. 예를 들어

, 당신은 작성하는 경우 :

procedure TMyClass.Bar; 
begin 
    Foo; 
end; 

다음 컴파일러는 클래스 메소드 또는 인스턴스 메소드를 호출 할 것인지 여부를 확인할 수 없습니다.

+0

이것은 거의 해결책이 아닙니다. 모든 합리적인면에서 호출자가 무시할 추가 매개 변수를 전달할 것으로 예상 할 수는 없습니다. –

+0

@DavidHeffernan : 내 실제 사례에서, 내 해결책이 될 것입니다 :) – whosrdaddy

+0

정말. 호출자에게 값이 무시되는 매개 변수를 전달하도록 요청할 것입니까? –

관련 문제