2011-04-03 136 views
2

我有以下類別:創建子類的一些實例在父類的方法

abstract class Transport{ 

    protected String name; 

    protected Transport(String name){ 
     this.name=name; 
    } 

    protected void DoSomething(){ 
     //Creating some instances of the type of the current instance 
    } 

} 

class Bike: Transport { 

    public Bike(String name): base(name){ 

    } 

} 

class Bus: Transport { 

    public Bus(String name): base(name){ 

    } 

} 

我想什麼做的是建立內部的當前實例的類型的一些實例DoSomething方法的Transport類。

我該怎麼辦呢?

我可以創建一個靜態工廠方法,它接受我想要創建的子類的名稱,然後使用this.GetType().NameDoSomething方法中當前實例的類名稱傳遞給它。

但這是最好的方法嗎?

非常感謝大家。

回答

10

您可以在基類中創建一個protected abstract Transport CreateNew(string name)方法,並在派生類中重寫它以調用其構造函數。

+2

+1這是模板方法模式。 – 2011-04-03 07:51:21

4

您是否願意使用反射?

protected void DoSomething(){ 
    Transport newOne = GetType() 
          .GetConstructors()[0] 
          .Invoke(new[] {"some name"}) 
} 

以上作品在您的具體情況。請注意使用[0]獲取第一個構造函數。對於你的問題中的微不足道的例子,這是一個非問題。您可以考慮使用System.Type上的其他重載來獲取所需的特定構造函數。

+2

或者使用'Activator.CreateInstance'。請注意,這會慢很多。 – SLaks 2011-04-03 11:38:19