如何使用具有只读成员的C#接口

问题描述 投票:1回答:1

接口不便

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

我会让代码说明一切:

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

问题:

  • 我可以让它成为一个类,因为接口无法实例化成员属性。但是由于C#不允许多重继承,并且由于我认为此功能是行为而不是实现,所以我不明白为什么它不应该是接口。而且它可能与已经具有基类的类发生冲突。
  • 我可以将其转换为属性,但是无论可访问性级别如何,如果它是继承的,仍可以在派生类的方法中对其进行修改,而我确实[[want readonly的行为。 (常量,但可以在构造函数中设置)
  • 我发现了属性System.ComponentModel.ReadOnlyAttribute,但是文档非常有限,它看起来不像readonly,但更像是可以在用户代码中查询的属性。
  • 如果将其转换为自动属性,则所有派生类都需要指定一个指向的私有数据成员,这再次意味着重复的代码(我试图通过首先使用此接口来避免此问题)
  • 出于完整性考虑,这是我想像的正确代码在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# interface protected datamember
    1个回答
    0
    投票
    C#接口没有状态,您不能在接口中声明字段不可写非只读

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

    public interface IHasApiKey { string ApiKey {get;} }

    并且类应该看起来像这样

    public class SomeFoo : IHasApiKey { private string _apiKey; public SomeFoo(string apiKey) { _apiKey = apiKey; } string ApiKey {get;} => _apiKey; }

    © www.soinside.com 2019 - 2024. All rights reserved.