2012-04-02 8 views
7

IAşırı yüklenme olan geçersiz kılma yöntemi nasıl aranır?

Bu kod hattı test ran
abstract class A 
{ 
    public abstract void Test(Int32 value); 
} 

class B : A 
{ 
    public override void Test(Int32 value) 
    { 
     Console.WriteLine("Int32"); 
    } 

    public void Test(Double value) 
    { 
     Test((Int32)1); 
    } 
} 

((Int32) 1), sonsuz özyinelemeye yığın taşmasına neden aşağıdaki basit kodu vardır. tek mümkün yolu doğru buldum (tamsayı parametresi) uygun yöntemi çağırmak için

(this as A).Test(1); 

olduğunu Ama iki yöntem de Testi herkese açıktır ve ben hem arama yapabilmek için kullanıcıların razıyım çünkü bu, benim için uygun değildir yöntem?

cevap

4

B başvurusu aracılığıyla A::Test(int) numaralı telefonu aramak için bir çeşit döküm gerekiyor. C# derleyicisi referansı B aracılığıyla gördüğü sürece, B::Test(double) sürümünü seçecektir.

daha az olduğu çirkin versiyonu da, aşağıdaki

((A)this).Test(1); 

Başka bir düşünce hem besleyen farklı bir isimle bir özel yöntemi olması. Tahmin edebileceğiniz gibi C#

class B : A { 
    public override void Test(int i) { 
    TestCore(i); 
    } 
    public void Test(double d) { 
    TestCore(1); 
    } 
    private void TestCore(int i) { 
    // Combined logic here 
    } 
} 
5

Yöntem aşırı yük çözünürlük her zaman davranmaz, ancak kod şartnamesine uygun davrandığını (Bir süre önce bu konuda a blog post yazdım).

Kısacası

, derleyici veya baz biri (sizin durumunuzda B olarak)

  • tip beyan edilmektedir (sizin durumunuzda Test yılında)

    • aynı ada sahip yöntemleri bularak başlamak tipleri
    • geçersiz kılma değiştirici son nokta

    Not ile beyan edilmez. Bu aslında mantıklıdır, çünkü sanal yöntemler çalışma zamanında çözülür, zamanı derlemez.

    Son olarak, (bu durumda, B) türünde bir aday olan bir yöntem varsa (bu, aramanızdaki parametrelerin, aday yönteminin parametre türüne dolaylı olarak dönüştürülebileceği anlamına gelir), bu yöntem kullanılacaktır. . Geçersiz kılınan yönteminiz karar sürecinin bir parçası değildir.

    Geçersiz kılma yöntemini çağırmak isterseniz, önce nesneyi temel türüne göndermeniz gerekir.