2012-08-24 28 views
11

Ben temel sınıf Aneden yüklenmiş yöntemleri

public class A 
{ 
    public virtual void Method(A parameter) 
    { 
     Console.WriteLine(MethodBase.GetCurrentMethod()); 
    } 
    public virtual void Method(B parameter) 
    { 
     Console.WriteLine(MethodBase.GetCurrentMethod()); 
    } 
} 

inhereted B

public class B : A 
{ 
    public virtual void Method(object parameter) 
    { 
     Console.WriteLine(MethodBase.GetCurrentMethod()); 
    } 

    public override void Method(A parameter) 
    { 
     Console.WriteLine(MethodBase.GetCurrentMethod()); 
    } 

    public override void Method(B parameter) 
    { 
     Console.WriteLine(MethodBase.GetCurrentMethod()); 
    } 
} 

uzantısı yöntemi ile statik sınıf S

public static class S 
{ 
    public static void Method(this B instance, B parameter) 
    { 
     Console.WriteLine(MethodBase.GetCurrentMethod()); 
    } 
} 

yerleştirme Örnek örneği oluşturmak örnek yöntemi daha düşük önceliğe sahiptüründeve üzerinde Method çağırmak, biz public override void Method(B parameter) gerçek sonuç public virtual void Method(object parameter) olduğunu bekleriz.

var b = new B(); 
b.Method(new B()); // B.Method (Object parameter) Why??? 

Neden derleyici daha uygun yöntemi seçmez ??? UPD Ve neden uzantı yöntemi değil?

+3

'B' iç içe değil, devralındı. –

+0

@Henk Holterman – user854301

+0

. Bu, eski kodun eski bir yöntem değil, yeni bir uzantı aramak olduğu eski kodun kırılmasını önlemek içindir. – Ankush

cevap

10

Neden derleyici daha uygun yöntem seçmez?

sürece, aday yöntemi bulma zaman göz ardı edilir herhangi aday yöntemler aslen (onlar türetilmiş bir sınıfta geçersiz konum üzerinde ise) bir taban sınıfta ilan dil şartname, normlarına bağlı kalınarak Çünkü türetilmiş sınıf, aramaların temel sınıfa kadar hareket ettiği herhangi bir geçerli yönteme sahip değildir.

Bu, designed to avoid the "brittle base class" problem'dır, ancak türetilen yöntemde yüzdüğün kırılmasını zor buluyorum. sınıf.

C 4. şartnamenin ilgili biraz bu ile biter, 7.4: kesinlikle tek miras olan arayüzlerinde tür parametreleri ve arayüzleri ve üye aramaları dışındaki türlerinde üye Aramalar

(Kalıtım zincirindeki her arabirim tam olarak sıfır veya bir doğrudan taban ara yüzüne sahiptir), arama kurallarının etkisi basitçe türetilmiş üyelerin temel üyeleri aynı isim veya imzayla gizlemesidir.

DÜZENLEME

: Yaklaşık uzatma yöntemleri ...

Ve neden uzantısı yöntemi değildir? spec bölüm 7.6.5.2 kaynaktan

: şekillerinden biri için bir yöntem çağırma (§7.5.5.1) 'de

expr . identifier () 
expr . identifier (args) 
expr . identifier <typeargs> () 
expr . identifier <typeargs> (args) 

ise çağrı normal işleme geçerli bir yöntem bulur, bir girişim bir uzatma yöntemi çağırma Yani bir

olarak yapı işlem yapılır Uzantı yöntemi, temel olarak son çare olarak sadece olarak kullanılır.

+0

Sanırım soru, kodun uzantı yönteminden ziyade miras alınan yöntemi çağırmasıdır, ancak söylemesi zor mu? – podiluska

+0

@podiluska: Uzantı yönteminin kırmızı bir ringa olduğunu düşünüyorum. OP'nin çağrılmasını beklemiyor gibi görünmüyor ... –

+0

Ayrıca, uzantı yönteminin neden çağrılmadığı da ilginç. – user854301

İlgili konular