2010-08-10 47 views

回答

6

一個可能的設計,將使用私有構造上的抽象類:如果派生的實現是緊耦合的選擇邏輯

public abstract class BaseClass 
{ 
    private BaseClass(Object param) 
    { 
     //Do something with parameters 
    } 

    //Provide various methods that descendant classes will know how to perform 

    public static BaseClass FromObject(Object value) 
    { 
     //Based on object, choose which type of derived class to construct... 
    } 

    private class HiddenDerivedA : BaseClass 
    { 
     public HiddenDerivedA(Object value) 
      : base(value) 
     { 
     } 
    } 

    private class HiddenDerivedB : BaseClass 
    { 
     public HiddenDerivedB(Object value) 
      : base(value) 
     { 
     } 
    } 
} 

此模式非常有用用於構建它們,並且希望爲代碼的其餘部分提供高度的絕緣。它使您不必擔心除了您明確指定的其他繼承者之外的其他繼承者的責任,並允許您將基類中的所有私有狀態公開給您的派生類。

3
  1. 很少。公共構造函數只能用作受保護的構造函數。

  2. 是的,它可以從其他(保護/公共)構造函數中使用關鍵字this調用('sideways')。

+0

2:你的意思是「this」這個關鍵字。 「基」在派生類中,不能調用私有類。 – 2010-08-10 23:45:20

+0

@John:是的,thx。將編輯。 – 2010-08-10 23:49:21

+0

@John,如果派生類型是派生類型的嵌套類,則「base」可以調用私有構造函數。 – 2010-08-11 00:12:31

3

問題#1:並不多。無論如何你都不能直接調用抽象類的構造函數(實例化它)。你只能從一個子類中調用一個,這意味着你肯定能夠訪問受保護的成員以及當時的公共成員。

問題2:不,沒有太大意義。抽象類上的私有構造函數只能通過來自同一個類中的非私有構造函數的「構造函數鏈接」來調用。

+0

#2可以是有用的。 – 2010-08-10 23:41:36

+0

@亨克霍特曼 - 我可以看到它。不會排除! – 2010-08-10 23:51:10

+2

#2 - 或者來自嵌套類型的構造函數,如Dan的答案。 – 2010-08-12 17:14:41

-1

似乎有沒有多大的區別對我來說,下面的代碼輸出,如果它的保護


酒吧

public abstract class Foo 
{ 
    protected Foo() { 
     Console.WriteLine ("Foo"); 
    } 
} 

public class Bar : Foo 
{ 
    public Bar() { 
     Console.WriteLine ("Bar"); 
    } 
} 

void Main() 
{ 
    new Bar(); 
} 

抽象構造函數不能被重寫。不知道如果我回答了你的問題:-)

+1

有沒有這樣的事情作爲「抽象構造函數」,你無論如何不能重寫構造函數。 – 2010-08-12 17:14:20

+0

這可能是這樣,但如果你嘗試上面的代碼,你會看到我有一個抽象類中的構造函數,當它創建一個派生類時,它確實會執行。 – 2010-08-15 18:56:31

0

爲了澄清我的第一個問題,我會再次回答(沒有評論)。所以,我知道直接抽象類是不可能的。只有當一個類從abstarct類派生出來時,纔可以被實例化。我知道一個類可以有私有,公共,內部和受保護的構造函數。我知道什麼保護意味着什麼。

但是在抽象類中公共受保護的構造函數之間有什麼區別。我無法看到兩者之間的區別。

相關問題