【问题标题】:Why can a class implement its own private nested interface in C#?为什么一个类可以在 C# 中实现自己的私有嵌套接口?
【发布时间】:2016-05-30 10:55:32
【问题描述】:

以下代码是一个有效的 C# 构造,可以很好地编译。

public class Weird : Weird.IWeird
{
    private interface IWeird
    {
    }
}

这有什么可能的用途?

编辑:这个问题比这个问题更具体:“What is a private interface?”。它表明可以从父类型本身实现私有接口,这似乎毫无意义。我能想到的唯一用途是接口隔离的一种奇怪情况,您希望将父类的实例作为IWeird 传递给嵌套类实例。

【问题讨论】:

  • 如果您也有一个实现该接口的嵌套私有类,您可能希望通过私有接口传递this 或该类的一个实例?相当深奥的东西,虽然:-)
  • 有什么问题?公共类可以实现私有接口吗?那一个类可以实现嵌套接口吗?只是这两者的结合?
  • 您正在使用Marker Interface 使用内部接口。虽然它是有效的并且它在外面没有任何目的。简短的回答 - 没有用处
  • 它可以编译吗? Mono's C# reports an error.

标签: c# .net oop inheritance interface


【解决方案1】:

这可能是编译器开发中的一种情况,即禁止某事的成本高于允许某事。禁止这种使用将需要编写和维护代码来检测这种情况并报告错误;如果该功能按原样工作,这对团队来说是一项额外的工作,并且可以避免。毕竟,也许有良好想象力的人可以想出一种使用该功能的方法。

就一个有用的例子而言,一个潜在的用途是在类中创建另一个实现,并将其用作替代方案,而不会将其暴露给 API 的用户:

public class Demo : Demo.Impl {
    // Private interface
    private interface Impl {
        public bool IsValidState {get;}
        void DoIt();
    }
    // Implementation for the error state
    private class Error : Impl {
        public bool IsValidState { get { return false; } }
        public void DoIt() {
            Console.WriteLine("Invalid state.");
        }
    }
    private readonly string name;
    // Implementation for the non-error state
    public bool IsValidState { get { return true; } }
    public void DoIt() {
        Console.WriteLine("Hello, {0}", name);
    }
    // Constructor assigns impl depending on the parameter passed to it
    private readonly Impl impl;
    // Users are expected to use this method and property:
    public bool IsValid {
        get {
            return impl.IsValidState;
        }
    }
    public void SayHello() {
        impl.DoIt();
    }
    // Constructor decides which impl to use
    public Demo(string s) {
        if (s == null) {
            impl = new Error();
        } else {
            impl = this;
            name = s;
        }
    }
}

就最佳实践而言,这种设计充其量是有问题的。特别是,我将为非错误实现创建第二个嵌套类,而不是为此目的重用主类。但是,这种设计并没有什么大问题(除了IsValidStateDoIt 都是可见的)所以C# 团队允许这种使用是可以的。

【讨论】:

    猜你喜欢
    • 2013-05-24
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    相关资源
    最近更新 更多