2015-08-08 133 views
0

雖然存在於這個話題很多問題,我無法找到(還)一個令人滿意的解決方案:訪問派生類

是否有可能(如果是,怎麼樣?)來訪問派生類從基本的虛擬方法?


讓我們想象一下,我有以下類別:

public class parent_class 
{ 
    public virtual string common_method() { 
     dynamic child = /* something to access the derived class */ ; 

     if (child == null) 
      return typeof(parent_class).FullName; 
     else 
      return child.GetType().FullName; 
    } 
} 

public class child_class1 : parent_class {} 
public class child_class2 : parent_class {} 
public class child_class3 : parent_class {} 

是否可以執行以下代碼(並得到正確的結果)?

parent_class p = new parent_class(); 
child_class1 c1 = new child_class1(); 
child_class2 c2 = new child_class2(); 
child_class3 c3 = new child_class3(); 

System.Console.WriteLine(p.common_method()); // result: 'parent_class' 
System.Console.WriteLine(c1.common_method()); // result: 'child_class1' 
System.Console.WriteLine(c2.common_method()); // result: 'child_class2' 
System.Console.WriteLine(c3.common_method()); // result: 'child_class3' 

編輯:閱讀評論和答覆後,我要補充以下幾點:

  • 我有大約300種不同的「子類」,所以首要的是不是一種選擇
  • 我不想打印派生類的名稱 - 這只是一個例子
  • @Siamak Ferdos:我嘗試了this關鍵字,但它不知如何按我的意圖工作。
+0

似乎覆蓋虛擬方法將是一條路。任何理由你不這樣做? – zneak

+0

我完全不清楚你想要做什麼。爲了得到你想要的結果,你根本不需要'動態',或者甚至'common_method'都是虛擬的。只需'返回GetType()。FullName'就可以了。 (順便說一下,即使對於測試樣本,也遵循.NET命名約定很有用。) –

+0

@zneak:這裏沒有必要這樣做...... OP可以在沒有任何虛擬方法的情況下得到他們想要的結果...... –

回答

1

是的,你可以通過「這個」關鍵字簡單地做到這一點:

public class parent_class 
    { 
     public virtual string common_method() 
     { 
      //dynamic child = /* something to access the derived class */ ; 

      if (this.GetType() == typeof(parent_class)) 
       return typeof(parent_class).FullName; 
      else 
       return this.GetType().FullName; 
     } 
    } 

    public class child_class1 : parent_class { } 
    public class child_class2 : parent_class { } 
    public class child_class3 : parent_class { } 
0

如果我理解你的問題正確的話,你希望通過一個共同的基類的方法來打印類的全名。在運行時,實際實例化的類型的名稱是GetType().FullName將生成的內容,而不是基類的類型。

這可以用一個簡單的例子進行測試:

void Main() 
{ 
    var parent = new Parent(); 
    var child = new Child(); 

    Console.WriteLine(parent.GetName()); 
    Console.WriteLine(child.GetName()); 
} 

public class Parent 
{ 
    public string GetName() 
    { 
     return this.GetType().FullName; 
    } 
} 

public class Child : Parent 
{ 
} 

收率:

UserQuery+Parent 
UserQuery+Child 

UserQuery是定義的命名空間。

此方法不需要在派生類中虛擬或重寫該方法。