2014-09-29 70 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