2012-12-27 3 views
0

외부에서 호출 할 수없는 public 메서드가있는 libary 클래스를 확장하려고합니다. 나는 "새로운"키워드를 사용하여 그것을 숨길 수 있다는 것을 알고 있지만 문제는 다른 선언이 많이 있다는 것입니다. 이 같은 뭔가 : C#의 부모 메서드에서 모든 재정의를 숨기는 방법

class Parent() { 
    public double method(double a, double b) { ... } 
    public int method(int a, int b) { ... } 
    public System.Int32 method(System.Int32 a, System.Int32 b) { ... } 
} 

지금 내가 할 수있는 :

class Child() { 
    // Make method private. 
    private new double method(double a, double b) { return base.method(a, b) } 
    private new int method(int a, int b) { return base.method(a, b) } 
    private new System.Int32 method(System.Int32 a, System.Int32 b) { return base.method(a, b) } 

    /// Own Code. 
} 

그러나 그 함수의 모든 재정의 개인 만들 수있는 간단한 방법이없는 경우 내가 궁금하네요.

+7

아니요. 메서드를 사용하기 전에 개체 ('Child'유형)가 'Parent'로 강제 변환되는 경우도 고려하십시오. C#의 상속은 기본 LSP 규칙에서 가장 잘 작동합니다. –

+2

@pst와 동의하십시오. 'Parent '에서'Child'를 파생시킬 때'Child' *는'Parent'라는 것을 기억해야합니다. 이 메소드를'Parent'에서 호출 할 수 있다면'Child'에서 호출 할 수 있어야합니다. –

+0

당신은 아마 맞을 것입니다, 나는 모두 준비가되어 있습니다. 스크립트 언어 측면에서 나는 여전히 너무 많이 생각한다고 생각합니다. 고맙습니다. – Gellweiler

답변

1

방법은 숨기는 방법이 아닙니다. private new 메서드는 Child 클래스 내부의 원래 메서드를 숨 깁니다 (그러나 그들은 숨겨진 것을 호출하므로 아무 것도 얻지 못합니다). Child에서 Grandchild 클래스 산정

는 아무 것도 private new 방법이 범위에 포함되지 않기 때문에 더 이상 숨겨진, 그래서 Parentpublic 방법은 완벽하게 호출와 "벌거 벗은"입니다됩니다. 메서드 숨기기는 숨겨진 메서드를 어떤 방식 으로든 제거하지 않습니다. 그것은 동일한 메소드가 호출되는 것의 문제 일뿐입니다.

+0

그리고'int'와'System.Int32'는 동의어입니다. 따라서 마지막 두 개의 오버로드가 이미 첫 번째 레벨에서 충돌합니다 (물론 허용되지 않습니다). –

2

첫 번째 질문은 자손 클래스를 부모로 형 변환해야하는지 여부입니다.

그렇지 않은 경우 가장 좋은 방법은 "부모"를 숨기고 자신의 방법을 통해서만 액세스를 허용하는 외관 패턴을 사용하는 것입니다. 등을

종류 :이 경우

class Parent { 
    public double method(double a, double b) { ... } 
    public int method(int a, int b) { ... } 
} 


class YourStuff { 
    private Parent _parent = new Parent(); 

    public int AddNumbers(int a, int b) { 
    return _parent.method(a,b); 
    } 
} 

는 부모 클래스는 숨겨져 있습니다.

+0

이렇게하면 상속 대신 [composition] (http://en.wikipedia.org/wiki/Object_composition)이 사용되며 이는 Asker에게 더 나은 해결책이 될 수 있음에 동의합니다. 그래도 그것이 그의 질문에 대한 대답인지는 모르겠다. '_parent'가 숨겨 졌다고 할 때, 다른 의미에서 "숨어있는"용어를 사용합니다. 당신은 일종의 [캡슐화] (http://en.wikipedia.org/wiki/Encapsulation_ (object-oriented_programming))에 대해 말하고있는 반면, C#에서는 "숨기기"는 일반적으로 한 멤버 (또는 네임 스페이스 등 .) 동일한 이름을 가진 다른 구성원의 우선 순위가 높기 때문에 액세스 할 수 없습니다. –