2010-11-23 13 views
5

A ve B'nin soyut olduğu ve C'nin somut bir uygulaması olan üç A, B ve C sınıfından oluşan bir kalıtım zincirim var. C# Birden fazla türetilmiş sınıf aşağı devralma zinciri için temel sınıf yöntemini geçersiz kılma

Ben aldı ve her zaman kullandığı asla ben denerseniz beton sınıfında C

geçersiz kılmak ve sadece sınıf C geçersiz kılmak istiyoruz baz soyut sınıf a, Foo() sanal yöntemine sahip varsayılan temel sınıf uygulaması, ancak her iki B & C'de geçersiz kılınırsa, sanal yöntemin yalnızca B.Foo() uygulamasını kullanır.

'Geçersiz kılma' dışında B.Foo() hakkında ek bir şey bildirmek zorunda mıyım?

abstract class A { 
    protected virtual string Foo() { 
    return "A"; 
    } 
} 

abstract class B : A { 
    protected override string Foo() { 
    return "B"; 
    } 
} 

class C : B { 
    protected override string Foo() { 
    return "C"; 
    } 
} 
+0

Eğer basitleştirilmiş test denediniz yeni olarak B'de yöntem sınıflarınızın sürümü? –

+1

Foo nasıl arıyorsun() C sınıfı mı? Numunenizi kullanarak çoğaltmayı denedim ve yapamadım. – Jason

+0

Diğer sorunlardan dolayı aynı sorun sorununu yaşadım. Bunlar düzeltildikten ve yeniden oluşturuldum hata giderildi. – Danielson

cevap

5

Huh: Açıkçası bu benim sınıfların versiyonlarını basitleştirilmiş, ancak

benim yöntem bildirimleri nelerdir?

A

Çıkış C'dur. B den Foo uygulanmasını çıkarın ve çıkış hala sorun B yöntemi geçersiz olduğundan C'den onu ararken, bu miras hiyerarşisinde onun uygulanmasına ulaşır asla var C

+0

Gerçekten de, şeyleri daha dikkatli okumayı denemeliyim. 'A' soyut olarak beyan edildiğinde, tarif edilen durumun nasıl tekrarlanabileceğinden emin değilim. +1 –

-3

olduğunu tanımladığınız yapmanız gerekenler
(Bu A'dan uygulanmasını geçersiz kılar, böylece) ve böylece C Eğer böyle bir şey kendi uygulaması olurdu oluyor kullanabilirsiniz (sanal olarak da tanımlamak

abstract class A 
{ 
    protected virtual string Foo() 
    { 
     return "A"; 
    } 
} 

abstract class B : A 
{ 
    protected new virtual string Foo() 
    { 
     return "B"; 
    } 
} 

class C : B 
{ 
    protected override string Foo() 
    { 
     return "C"; 
    }