c# - 'C# in depth' 中的抽象类实例化

标签 c# code-contracts

我目前正在阅读 Jon Skeet 的“C# 深入”,其中有一个示例描述了代码契约,其中抽象类实现了一个接口(interface),该接口(interface)作为接口(interface)的伴随类,用代码契约的术语来说:一个“契约类” For'(我不会在这里详细介绍代码契约的工作原理)。

界面(第 467 页):

[ContractClass(typeof(ICaseConverterContracts))]
public interface ICaseConverter
{
    string Convert(string text);
}

抽象类:

[ContractClassFor(typeof(ICaseConverter))]
internal abstract class ICaseConverterContracts : ICaseConverter
{
    public string Convert(string text)
    {
         Contract.Requires(text != null);
         Contract.Ensures(Contract.Result<string>() != null);
         return default(string); // returns dummy value
    }

    // prevents instantiation
    private ICaseConverterContracts() { }

}

(我根据书上的注释在代码中添加了注释)

我的问题:

既然不能实例化一个抽象类,为什么还要给这个抽象类加上私有(private)构造函数呢?我没有得到什么?

最佳答案

虽然 abstract 类不能直接实例化,但构造函数上的访问修饰符(例如 private)在继承时很重要。通过将构造函数设为 private 而不是默认构造函数,您就可以构造它,这样就无法构造继承的类。由于这是唯一的构造函数,您实际上是在使类密封,因为没有继承类(除非它嵌套在ICaseConverterContracts 中)可以编译(至少在 C# 中)。

我猜测 Code Contracts 代码通过反射或其他绕过构造函数是 private 问题的方式来实例化类。

关于c# - 'C# in depth' 中的抽象类实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19519840/

相关文章:

c# - 代码契约(Contract)不能反转条件?

c# - 我如何使用linq优化嵌套的for循环

.net - 为什么接口(interface)契约(Contract)不适用于装配外部?

c# - 更新面板和 GridView

c# - 使用 HtmlAgilityPack 编写 LINQ 来解析 aspx 页面

c# - 为什么 Code Contracts 声称此代码为 "Ensures is false"?

c# - 通过 Contract.Ensures() 声明返回非空序列时防止 Resharper 警告?

c# - 如何使用代码契约来确保方法始终返回非空、非空值?

c# - C# "as"关键字是否有比简单转换更多的内容?

c# - 如何使用 Entity Framework 插入或选择