2009-06-09 30 views
44

en biz bu iki sınıf var diyelim:C# taban sınıftan türetilmiş tür olsun?

public class Derived : Base 
{ 
    public Derived(string s) 
     : base(s) 
    { } 
} 

public class Base 
{ 
    protected Base(string s) 
    { 

    } 
} 

nasıl Derived çağıran olduğunu Base yapıcısı içinden öğrenebilirim? Bu benim ile geldi budur:

public class Derived : Base 
{ 
    public Derived(string s) 
     : base(typeof(Derived), s) 
    { } 
} 

public class Base 
{ 
    protected Base(Type type, string s) 
    { 

    } 
} 

, örneğin, Base 'ın yapıcı içerisinde gelen yansımaları kullanmanın bir yolunu typeof(Derived) geçen gerektirmeyen başka bir yolu var mı?

cevap

79
using System; 
using System.Collections.Generic; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Base b = new Base(); 
      Derived1 d1 = new Derived1(); 
      Derived2 d2 = new Derived2(); 
      Base d3 = new Derived1(); 
      Base d4 = new Derived2(); 
      Console.ReadKey(true); 
     } 
    } 

    class Base 
    { 
     public Base() 
     { 
      Console.WriteLine("Base Constructor. Calling type: {0}", this.GetType().Name); 
     } 
    } 

    class Derived1 : Base { } 
    class Derived2 : Base { } 
} 

Bu program aşağıdaki verir:

Base Constructor: Calling type: Base 
Base Constructor: Calling type: Derived1 
Base Constructor: Calling type: Derived2 
Base Constructor: Calling type: Derived1 
Base Constructor: Calling type: Derived2 
+25

Çok ilginç bir gerçeği bir sürü kod içinde saklıyorsunuz. ' – VVS

+0

daha iyi bir örneği, Derived1 d1 = yeni baz() 'çıkışını gösteren olacaktır' bir derleme hatası üretir, muhtemelen başka bir yol anlamına gelir. FYI '((Base) yeni Derived1(). GetType(). Name'" Türetilmiş1 "dir. – Seph

+3

' Derived1 d1 = yeni baz (;); –

İlgili konular