2013-08-01 1 views
2

나는 myName의 클래스와 함께 Foo을 가지고있다. Foo에서
클래스 bar 상속과는 호출되는 속성이 난 이후이 확인을해야한다 생각같은 이름의 상속 된 함수를 숨기는 속성이있는 이유는 무엇입니까?

myName :

  1. property will compileget_myName()에 (그래서 Foo::myName(int,int)와의 충돌이 없을 것)
  2. Foo::myName에는 인수가 있지만 분명히 속성은 (다시 colision이 없습니다).

    int get_myName() 
    { 
        return a+b; 
    } 
    

    로 : 나는 bar에 기능을 추가하는 경우, 또한

    public class Foo 
    { 
        public int myName(int a, int b) 
        { 
         return 0; 
        } 
    } 
    
    class Bar: Foo 
    { 
        int a; 
        int b; 
    
        int myName 
        { 
         get 
         { 
          return a + b; 
         } 
        } 
    } 
    

    :

    'Bar.myName' hides inherited member 'Foo.myName(int, int)'. Use the new keyword if hiding was intended. 
    

    예제 코드 :

하지만 난 여전히 경고가 특급 내가 이전에 선언 한 함수에 대한 오류가 발생했습니다.
그래서 여기서 무엇이 일어나고 있습니까? 이 속성은 get_myName() 외에 myName의 모든 오버로드를 사용할 수 없습니까?

+0

속성과 동일한 메서드 이름을 사용하는 이유를 묻는 질문이 있습니까? 일반적으로 리턴 타입에 어떤 로직이 관련되어 있다면, 메소드를 사용하는 것이 더 낫다. else 속성 – Sayse

+0

@Sayse 상위 클래스가 더 일반적이고 결과가 무엇인지 결정하는 데 인수가 필요하다. 파생 클래스는 훨씬 더 구체적이며 인수가 고정되어 있습니다. 모든 속성은 get {base.myName (this.a, this.b);}입니다. 그래서 당신은 functinality가 동일하다는 것을 알 수 있습니다. 속성은 코딩하기 쉽도록하기위한 것입니다. –

답변

4

제 10.3.3에 대한 정의를 포함 포함

,

파생 된 클래스는 같은 이름이나 서명을 가진 새 멤버를 선언하여 상속 된 멤버를 숨길 수 있습니다.

두 멤버가 같은 종류의 멤버 여야한다는 것에 대해서는 아무런 언급이 없습니다. 하나가 속성이고 하나가 메서드 인 경우에도 여전히 혼란 스러울 수있는 경우가 있습니다.

  • 속성은 대리자 형식 일 수 있습니다. Action<int, int>이 경우 PropertyName(10, 10)이 유효합니다.
  • 속성 이름을 사용하는 곳에서 메서드 그룹 변환을 수행하려고 할 수 있으므로 둘 다 유효합니다.

동일한 클래스 내에서 섹션 10의 규칙을 실행합니다.3 : 상수, 필드, 속성, 이벤트 또는 유형의

  • 이름은 같은 클래스에 선언 된 다른 모든 구성원의 이름과 달라야합니다.
  • 메소드의 이름은 같은 클래스에 선언 된 다른 모든 비 메소드의 이름과 달라야합니다. [...]

당신이 의견에 언급 한 바와 같이, 절 10.3.9.1에 언급 get_myName라는 메소드를 선언 할 수 있다는 사실.

+1

사양은 "10.3.9.1"속성에 예약 된 구성원 이름의'get_myName'을 처리합니다 : T 유형의 속성 P (§10.7)의 경우 다음 서명이 예약됩니다 :'T get_P();'void set_P (T value) ; 두 속성은 읽기 전용이거나 쓰기 전용 인 경우에도 모두 예약되어 있습니다. " – hvd

+0

@hvd : 아, 감사합니다 - 그 점을 발견하지 못했습니다. 제거 할 것입니다. –

0

우리는 심지어 그림에서 상속을 필요로하지 않습니다 - 당신은 속성과 방법 사이의 "오버로드"할 수 없습니다 :

class Program 
{ 
    static void Main(string[] args) 
    { 

     Console.ReadLine(); 
    } 

    void DoStuff(int i,int j) 
    { 

    } 

    int DoStuff { get { return 10; } } 
} 

생산 :

오류 CS0102을 : 유형을 'ConsoleApplication4.Program'는 이미 C#을 사양의 'DoStuff'

관련 문제