我创建了一个具有静态属性的通用接口,但实现该接口的类似乎无法访问该属性或将其公开给其他代码。
例如,下面的代码将无法编译,因为
TestClass.Empty
无法解析。我希望并期望有人可以向我解释为什么会这样,以及是否有办法修改代码来完成我所期望的事情,这样实现 IEmpty
接口的类不需要添加任何代码公开 Empty
属性。
public interface IEmpty<T> where T : class, new()
{
public static virtual T Empty { get; } = new ();
}
public sealed class TestClass : IEmpty<TestClass>
{
public bool IsEmpty => this == TestClass.Empty;
}
我确信这个解释是我应该知道的,但我想你会是告诉我它是什么的人。
如果您只想拥有 一个默认静态实现,并且不打算在实现接口的类中覆盖它,则删除接口属性的
virtual
修饰符:
public interface IEmpty<T> where T : class, new()
{
public static T Empty { get; } = new();
}
public sealed class TestClass
{
public bool IsEmpty => this == IEmpty<TestClass>.Empty;
}
正如您从上面的代码中看到的,您甚至不需要
TestClass
来实现接口即可使其工作 - 任何代码 都可以访问静态属性。
可能有用的是限制对实现
IEmpty<T>
的类/接口范围的可访问性。您可以通过将属性修饰符更改为 protected
来实现
public interface IEmpty<T> where T : class, new()
{
protected static T Empty { get; } = new();
}
public sealed class TestClass : IEmpty<TestClass>
{
public bool IsEmpty => this == IEmpty<TestClass>.Empty;
}
如果您希望每个实现类都公开一个 Empty 属性,则需要在类中显式定义它:
public interface IEmpty<T> where T : class, new()
{
bool IsEmpty { get; }
}
public sealed class TestClass : IEmpty<TestClass>
{
public static TestClass Empty { get; } = new();
public bool IsEmpty => this == TestClass.Empty;
}