2014-09-29 88 views
2

我一直在尋找一段時間,因爲我自然健忘,我認爲這會很好地構建一些東西(抽象類,接口等?),這會迫使我實現某些代碼位我正在寫一個班。C#:使用抽象類強制構造函數簽名?

特別是,我想強制一個新的類總是有一個構造函數,它將一個單獨的參數類型化爲自身,以便更容易地重複對象。我在其他地方看到過有關這方面的文章/問題,但我不確定這個問題是否被問到(至少我能找到),或者我對其他文章/問題沒有足夠的理解來實現它。我提前道歉。

我不想在抽象類,接口等中有構造函數,實際上做任何事情。我只想定義派生類中構造函數簽名的要求。

我理想的課堂應該是這樣的:

public class GoodClass 
{ 
    public GoodClass(GoodClass goodClass) 
    { 
     // copy components of goodClass to this instance 
    } 
} 

於是,我第一次開始研究接口,也開始在抽象類閱讀起來。我在想像下面的代碼會起作用,但唉,我得到的錯誤。我試圖做甚至可能嗎?有沒有其他方法可以在我的顯示器上貼上便條,從而實現我的目標? :)

abstract class SelfConstructor 
{ 
    abstract public SelfConstructor(SelfConstructor) { } 
} 

class NewClass : SelfConstructor 
{ 
    //Required by SelfConstructor: 
    public NewClass(NewClass newClass) 
    { 
     // copy components of newClass to this instance 
    } 
} 

回答

1

你可以編寫一個ReSharper插件來識別這種情況,並在沒有「拷貝構造函數」的情況下突出顯示該類。這將是一個daemon stage,它會在文件被編輯時處理它,並添加高亮。您可以查看文件的抽象語法樹,查找IConstructorDeclaration的所有實例,然後從ParameterDeclarations屬性中獲取構造函數的參數。您可以檢查是否有一個構造函數,只有一個參數,該參數是同一類型的,因爲它是在聲明的類。

您可以通過獲取比較類型構造函數的參數的TypeUsage,並試圖向下轉換IUserTypeUsage。然後您可以使用ScalarTypeName.Reference.Resolve()獲取IDeclaredElement的實例。將其與該課程的IClassDeclaration.DeclaredElement進行比較,看看它們是否是相同的實例。

1

在C++中,你所談論的是一個拷貝構造函數,你實際上得到一個默認! C#沒有這個概念(雖然當然你可以定義一個)。然而,簡單地實施ICloneableMSDN)更容易(並且是首選),這需要您實施Clone方法,它也執行相同的操作。

相反的:

object myObj = new CloneableObject(otherObj); 

你寫:

object myObj = otherObj.Clone(); 

其他的事情你可能做的是沒有默認強制構造函數簽名:

public class BaseClass 
{ 
    //No abstract constructors! 
    public BaseClass(BaseClass copy) 
    { 
    } 
} 

現在,當你派生時,你必須在構造中使用這個重載構造函數。沒有什麼會迫使衍生簽名,但至少你必須明確地使用它:

public class DerivedClass : BaseClass 
{ 
    public DerivedClass() : base(this) 
    { 
    } 
} 

上面的例子清楚地表明,它不會「強迫」你有一個拷貝構造函數,但像粘請注意,這將是一個很好的提醒。

我肯定會去接口路由,因爲那是什麼(你可以使用抽象的實現!)。

請注意,你可以利用Object.MemberwiseClone如果你想副本是免費的。所有對象都可以得到這個,不需要接口。

+2

克隆方法很好,但實際上Microsoft建議不要實現ICloneable,主要是因爲如果克隆深度較淺或接口較淺時,接口不會處於任何狀態。 – 2014-09-29 22:11:16

+0

@AdiLester這完全是真的,「克隆」可以做你想做的任何事情。如果你遵循語義,它基本上是一個複製操作的接口。 – BradleyDotNET 2014-09-29 22:12:35

+2

...以及[MSDN](http://msdn.microsoft.com/en-us/library/system.icloneable%28v=vs.110%29.aspx)中的引用:「因爲Clone的調用者不能取決於執行可預測克隆操作的方法,我們建議ICloneable不能在公共API中實現。「 – 2014-09-29 22:13:55