为什么一个类可以在C#中实现自己的私有嵌套接口?

时间:2016-02-18 10:20:51

标签: c# .net oop inheritance interface

以下代码是编译juste的有效C#构造。

<ImageView
     android:id="@+id/something"
     android:layout_height="500dp"
     android:layout_gravity="center"
     android:layout_width="150dp"                
     android:scaleType="centerCrop"
   android:background="@drawable/border_back"
     android:padding="3dp"
     android:src="@drawable/myPic">
   </ImageView>

这会有什么用处?

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

1 个答案:

答案 0 :(得分:3)

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

就一个有用的例子而言,一个潜在的用途是在类中创建另一个实现,并将其用作替代方案,而不将其暴露给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#团队可以允许这样使用。