首页 > 解决方案 > 如何拥有只读成员的 C# 接口

问题描述

界面不便

我最近发现自己需要一些东西,这在 C# 中应该很有可能(我知道它在 C++ 中):几个类需要一个 api 密钥,它绝对必须是一个私有的、不可变的字段(除了在构造函数)。为了避免代码重复,我想为需要 api 密钥的类创建一个接口。

我会让代码自己说话:

public interface IHasApiKey
{
    protected readonly string _apiKey = String.Empty;
}

问题:

为了完整起见,这是我想象的正确代码在 C++ 中的样子:

class IHasApiKey
{
private:
    std::string _apiKey = "";
protected:
    IHasApiKey(const std::string& apiKey) : _apiKey(apiKey) {}

    // tbo, I'm not quite sure about how to optimally write this one,
    // but the idea is the same: provide protected read access.
    const std::string& GetKey() { return const_cast<std::string&>(_apiKey); }
};

我解释得当吗?有没有人知道如何优雅地解决这个问题?提前非常感谢。

标签: c#interfaceprotecteddatamember

解决方案


C#接口没有状态,你不能在接口中声明字段不可写非只读。事实证明,要保持状态,您需要类,因此在您的情况下,它应该是基类或具体类...

一种方法是在接口中声明一个 get 属性,这将强制实现该接口的所有类提供 get

public interface IHasApiKey
{
    string ApiKey {get;}
}

和类应该是这样的

public class SomeFoo : IHasApiKey
{
    private readonly string _apiKey;
    public SomeFoo(string apiKey)
    {
        _apiKey = apiKey;
    }

    public string ApiKey => _apiKey;
}

推荐阅读