C#:使用抽象类强制构造函数签名?

标签 c# inheritance interface constructor abstract

我已经在这方面搜索了一段时间,因为我天生健忘,我认为构建一些东西(抽象类、接口(interface)等?)来迫使我实现某些代码会很好在我正在写作的类里面。

特别是,我想强制一个新类始终具有一个构造函数,该构造函数采用单个参数作为其自身类型,以便更轻松地复制对象。我在其他地方看到过谈论此问题的文章/问题,但我不确定是否有人提出过这个特定问题(至少我能找到),或者我只是对其他文章/问题了解不够,无法意识到这一点。提前致歉。

我对让抽象类、接口(interface)等中的构造函数实际执行任何操作不感兴趣。我只是对在派生类中定义构造函数签名的要求感兴趣。

我理想的类(class)是这样的:

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

因此,我首先开始研究接口(interface),并开始阅读抽象类。我本以为下面的代码会起作用,但可惜我遇到了错误。我想做的事情可能吗?有没有其他方法可以实现我的目标,而无需在显示器上贴便签? :)

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

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

最佳答案

您可以编写一个 ReSharper 插件来识别这种情况并突出显示该类(如果它没有“复制构造函数”)。这将是 daemon stage这将在编辑文件时对其进行处理,并添加突出显示。您可以查看文件的抽象语法树,查找 IConstructorDeclaration 的所有实例,然后从 ParameterDeclarations 属性获取构造函数的参数。您可以检查是否存在一个只有一个参数的构造函数,并且该参数与声明它的类的类型相同。

您可以通过获取构造函数参数的 TypeUsage 并尝试向下转换为 IUserTypeUsage 来比较类型。然后,您可以使用 ScalarTypeName.Reference.Resolve() 获取 IDeclaredElement 的实例。将其与类的 IClassDeclaration.DeclaredElement 进行比较,看看它们是否是同一个实例。

关于C#:使用抽象类强制构造函数签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26109685/

相关文章:

c# - 继承什么 .net 类以使用 asp.net session ,但不是页面

oop - typescript 父类正在调用派生函数

c++ - 使用没有堆内存分配的接口(interface)的框架应用程序?

c# - Settings.settings 与 app.config?

c# - C# 中的 uniqueidentifier 等效数据类型

c# - 统一构建错误 : The name 'EditorUtility' does not exist in the current context

c# - 关闭文本框的文本输入?

Javascript - 在原型(prototype)上放置一个常量

c++ - 数据抽象和封装的好处

java - 如何确保实现中泛型方法的类型?