2015-11-12 56 views
2

外部框架有以下類:直通構造

public class Boatmaker 
{ 
} 

public class Wood 
{ 
} 

public class Axe 
{ 
} 

public class Lake 
{ 
} 

public class Boat 
{ 
    public Boat(Wood wood, Axe axe) { 
    } 
    public Boat (Boatmaker maker) {  
    } 
    public Boat (Lake lake) {} 
} 

我需要做很多船子類。對於我的每個子類,我必須假設外部框架可能想要通過上述任何構造函數來實例化它。所以我的子類獲得傳遞構造函數。請注意,他們怎麼也不會走:

public class SmallBoat: Boat 
{ 
    public void DoSmallBoatStuff() { 
    // some code here 
    } 
    private void Initialize() { 
    this.DoSmallBoatStuff(); 
    } 
    public SmallBoat(Wood wood, Axe axe): base(wood, axe) { 
    this.Initialize(); 
    } 
    public SmallBoat (Boatmaker maker): base(maker) { 
    this.Initialize(); 
    } 
    public SmallBoat (Lake lake): base(lake) { 
    this.Initialize(); 
    } 
} 

public class Canoe: SmallBoat 
{ 
    public void DoCanoeStuff() { 
    // some code here 
    } 
    private void Initialize() { 
    this.DoCanoeStuff(); 
    } 
    public Canoe(Wood wood, Axe axe): base(wood, axe) { 
    this.Initialize(); 
    } 
    public Canoe (Boatmaker maker): base(maker) { 
    this.Initialize(); 
    } 
    public Canoe(Lake lake): base(lake) { 
    this.Initialize(); 
    } 
} 

我想知道是否有一種方法可以簡化代碼的外觀。構造函數在SmallBoat和Canoe中編寫的唯一區別是SmallBoat或Canoe。其他一切都是一樣的。

所以,如果有一種方法來寫構造函數而不實際在構造函數中使用類的名字,這將有很大的幫助。我可以使用不帶.tt文件的直接複製和粘貼(這對我來說並不真正可行 - 我的大部分工作都不是在Visual Studio中完成的)。有沒有辦法做到這一點?

回答

1

不,沒有。您必須指定要從當前類中提供的基類的哪些構造函數。沒有提到真正的類名稱,沒有辦法編寫構造函數。

這可能是您正在顯示的簡化,但如果Initialize是唯一調用的方法,則可能需要將該調用移至基類,調用可從實現類中覆蓋的受保護Initialize方法。 (你必須採取在考慮調用該方法和實例的屬性/字段的順序,你可以遇到麻煩那裏,所以它可能不是你的情況可行)

+0

@William:需要更多的幫助? –

1

1的代碼自動化打字

有代碼片段:ctor,它有助於創建「唯一」的默認構造函數。
要使用它,鍵入ctor一個表格兩次。

可以複製原始代碼片段來創建自己的代碼片段。
在Visual Studio中,進入Tools menu/Code snippet manager
你可以在這裏看到snippet文件的目錄。
您可以將代碼段(例如ctor.snippet)複製到「My Code Snippets」,重新命名並編輯。也可以設計

2.船層次

船層次的設計所以只有在基類中的默認構造函數,你必須在公共屬性或公共方法(S)要提供的基類Lake,Axe,BoatMaker,...

1

如果您可以更改設計,我強烈建議從對象本身分離對象實例化。這樣,Factory MethodTemplate Method設計模式相結合,這非常有幫助:

public abstract class BoatFactory 

{  protected abstract void Initialize(); 
     protected Wood Wood; 
     protected Axe Axe 
     protected Boatmaker Boatmaker ; 
     public Boat MakeBoat(Wood wood, Axe axe) 
     { 
      this.Wood = wood; 
      this.Axe = axe; 
      Initialize(); 
     } 
     public Boat MakeBoat(Boatmaker maker) 
     { 
      this.Boatmaker = Boatmaker ; 
      Initialize(); 
     } 
     public Boat MakeBoat(Lake lake) 
     { 
      this.Lake = lake; 
      Initialize(); 
     } 
} 

public class SmallBoatFactory : BoatFactory 
{ 
     protected override void Initialize() 
     { 
      // do customized init operations here 
     } 
} 
+0

我希望我能做到這一點。但我無法控制這個框架。 –

+0

那麼什麼樣的類型和類別不受你的控制? – Alireza

+0

船和在其構造函數中翻譯。 –