c# - 如何拥有只读成员的 C# 接口
问题描述
界面不便
我最近发现自己需要一些东西,这在 C# 中应该很有可能(我知道它在 C++ 中):几个类需要一个 api 密钥,它绝对必须是一个私有的、不可变的字段(除了在构造函数)。为了避免代码重复,我想为需要 api 密钥的类创建一个接口。
我会让代码自己说话:
public interface IHasApiKey
{
protected readonly string _apiKey = String.Empty;
}
问题:
- 我可以让它成为一个类,因为接口不能实例化成员属性。但是由于 C# 不允许多重继承,而且我认为这个特性是一种行为而不是实现,所以我不明白为什么它不应该是一个接口。它可能会与已经有基类的类发生冲突。
- 我可以将它转换为属性,但是无论可访问性级别如何,如果它是继承的,它仍然可以在派生类的方法中进行修改,而我真的想要
readonly
. (常量,但可以在构造函数中设置) - 我发现了 attribute
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#接口没有状态,你不能在接口中声明字段不可写非只读。事实证明,要保持状态,您需要类,因此在您的情况下,它应该是基类或具体类...
一种方法是在接口中声明一个 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;
}
推荐阅读
- python - 将多个图像复制到剪贴板
- google-colaboratory - Google Colab TypeError:需要一个整数(获取类型 str)
- r - 用于常规读取数据的闪亮模块(不是由新会话触发
- firebase - FLutter:无法完成从 Firestore 中检索数据
- android - 尝试更改另一个片段上的文本视图
- python - 遮罩多边形和精灵之间的碰撞
- python - 数据框从值中获取索引日期
- c# - 运算符“*”不能应用于“void”和“float”类型的操作数
- javascript - 未处理的拒绝(TypeError):net.isIPv4 不是 ReactJS 的函数
- python - mixins 是跨不同实体类型存储多个属性的正确选择吗?