以下代码是编译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
{
}
}
传递给嵌套的类实例。
答案 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;
}
}
}
就最佳实践而言,这种设计充其量是值得怀疑的。特别是,我将为非错误实现创建第二个嵌套类,而不是为此目的重用主类。但是,这个设计没有什么特别的错误(除了IsValidState
和DoIt
都可见之外)所以C#团队可以允许这样使用。