2016-11-03 6 views
0

죄송합니다. 어리석은 질문이거나 이미 요청한 경우입니다. 그래서 여기 ... 지금이 권리를 테스트 할 수 있도록 내가 주변에 인터넷 검색을 해봤 내가있는 위치에 정말 아니에요은 간다 :C#의 메소드가 다른 메소드를 오버라이드하고 동시에 가상 일 수 있습니까?

사진이 시나리오 다음과

public class Bottom 
{ 
    virtual public void foo() 
    { 
     doTheThing(); 
    } 
} 

public class Middle : Bottom 
{ 
    virtual override public void foo() //this function will both override the parent's foo() and letting its child's foo() be over ridden 
    { 
     base.foo(); 
     doTheOtherThing(); 
    } 
} 

public class Top : Middle 
{ 
    override public void foo() 
    { 
     base.foo(); 
     doTheFinalThing(); 
    } 
} 

가운데 하나 의견은 제가 묻는 것입니다.

괜찮습니까? 그것은 전통적인 것인가? 올바른 순서로 키워드가 있습니까? 그게 그렇게 중요한 건가? 이 작업을 수행하는 가장 올바른 방법은 무엇입니까?

+0

가상 메서드는 가상의 모든 방법을 사용하면 아무 것도 할 필요가 없습니다. 따라서 중간 버전에서 "가상"키워드 만 제거하십시오. – Evk

+0

질문하기 전에 관심있는 코드를 컴파일 해보십시오. 현재 코드에서 컴파일 타임 오류가 발생하므로 분명히 "할 수있는 일"이 아닙니다. –

+1

[documentation] (https://msdn.microsoft.com/en-us/library/ebca9ah3.aspx)를 확인하십시오. "새 메서드, 정적 또는 가상 한정자를 사용하여 재정의 메서드를 수정할 수 없습니다. 재정의 된 속성은 가상, 추상 또는 대체 여야합니다. " –

답변

0

아래쪽 기본 클래스에 정의 된 가상 메서드는 메서드가 가상이며 메서드 호출이 가장 파생 된 구현을 실행 함을 의미합니다. 이 동작은 모든 재정의에 상속됩니다.

즉, "재정의"키워드 만 지정하면됩니다. 기본 메소드는 이미 가상임을 확인하므로 재정의 할 때 다시 지정할 필요가 없습니다. 컴파일러는 당신이 그렇게 할 수 있도록 허용하지 않습니다.

또한 많은 사람들은 "상속에 대한 구성"을 선호해야한다고 주장하지만, 이는 다른 논의입니다. 여러 번 재정의하는 것은 좋아하고 정확합니다.