2013-12-11 5 views
2

Учитывая три родителя/дочерние классов, как это:Переопределение метода в многоуровневом Наследование

class A { 
    public virtual void doSomething() { 
     //do things 
    } 
} 

class B : A { 
    public override /*virtual?*/ void doSomething() { 
     //do things 
     base.doSomething(); 
    } 
} 

class C : B { 
    public override void doSomething() { 
     //do things 
     base.doSomething(); 
    } 
} 

Если класс B «s doSomething() метода оба override и virtual в своей подписи, поскольку она также переопределяются C класс, или только класс A имеет virtual в своем методе doSomething()?

+2

Вы пробовали этот код? Visual Studio жалуется, что «метод переопределения не может быть помечен как виртуальный». –

+0

Это странно. Он не жалуется на меня. –

+0

Жалуется ли, если вы раскомментируете '/ * virtual * /' в 'B'? –

ответ

6

Вам не нужно (читать: вы не можете) отмечать метод как виртуальный, если он уже был отмечен как виртуальный в одном из суперклассов.

Метод будет оставаться виртуальным во всем дереве наследования, пока подкласс не отметит его как sealed. Запечатанный метод не может быть переопределен каким-либо из подклассов.

4

От MSDN:

Вы не можете использовать новый, статический или виртуальные модификаторы изменить способ переопределения.

Кроме того,

Метод переопределяется Основание должно быть виртуальным, абстрактные или переопределение.

Это означает, что вы можете переопределить метод, который уже помечен как переопределение.

Смежные вопросы