访问通用接口中的静态属性[重复]

问题描述 投票:0回答:2

我创建了一个具有静态属性的通用接口,但实现该接口的类似乎无法访问该属性或将其公开给其他代码。

例如,下面的代码将无法编译,因为

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;
}

我确信这个解释是我应该知道的,但我想你会是告诉我它是什么的人。

c# generics interface properties static
2个回答
2
投票

如果您只想拥有 一个默认静态实现,并且不打算在实现接口的类中覆盖它,则删除接口属性的

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;
}

-1
投票

如果您希望每个实现类都公开一个 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.