2011-07-22 10 views
10

Ben Türetilmiş sınıfının bir örneğini oluşturursanız koduAşırı çözünürlük

public class Base 
{ 
    public virtual int Add(int a,int b) 
    { 
     return a+b; 
    } 
} 

public class Derived:Base 
{ 
    public override int Add(int a,int b) 
    { 
     return a+b; 
    } 

    public int Add(float a,float b) 
    { 
     return (Int32)(a + b); 
    } 
} 

düşünün ve onu şamandıra parametreleriyle Add yöntemini çağırarak neden int türünde parametreleri ile ekle çağrı

Derived obj =new Derived() 
obj.Add(3,5) 

// why this is calling 
Add(float a,float b) 

Neden daha spesifik bir yöntemi çağırmıyor?

+1

3 ve 5'in int olduğunu nasıl biliyorsunuz? Türlerini belirtmeyi deneyin ve ne olduğunu görün. –

+0

Bunun nasıl olduğunu biliyor musunuz? –

+0

Bunu derleyebiliyor musunuz? Int için float gibi bazı döküm hataları alabilirsiniz? – Anuraj

cevap

15

Bu, tasarım gereğidir. C# Dil özellikleri durumlarının Bölüm 7.5.3:

Örneğin, bir yöntem çağırma için aday grubu aday varsa olmayan yöntemler işaretli geçersiz kılma (§7.4) ve bir baz sınıfta yöntemleri içermez türetilmiş bir sınıfta yöntem uygulanabilir (§7.6.5.1). senin Derived sınıf olmayan bir geçersiz Add yöntemi olduğundan başka deyişle

, Base sınıfı (ve Derived yılında geçersiz kılınan versiyonunda) içinde Add yöntem artık aşırı yük çözünürlüğü için adaylardır.

Base.Add(int,int) daha iyi bir eşleşme olsa bile, Derived.Add(float,float)'un varlığı, taban sınıfı yönteminin hiçbir zaman derleyici tarafından dikkate alınmadığı anlamına gelir.

Eric Lippert bu tasarımın bazı nedenlerini this blog post numaralı telefondan ele almaktadır. Türetilmiş sınıfta bildirilen herhangi bir uyumlu yöntemler olup olmadığını

+0

+1 iyi yanıt. Daha fazla okuma için kanıt, açıklama ve bağlantılar. – Matt

+0

Özgün yöntemi aynı şekilde görünür halde tutarken, sanal bir yöntem için aşırı yükleme eklemenin bir yolu var mı? – supercat