我最近发现自己需要一些东西,这在C#中应该是可以实现的(我知道它在C ++中是这样的:几个类需要一个api键,它绝对必须是一个私有的,不可变的字段(除非声明,在构造函数中)。为了避免代码重复,我想为需要api键的类创建一个接口。
我会让代码说明一切:
public interface IHasApiKey
{
protected readonly string _apiKey = String.Empty;
}
问题:
readonly
的行为。 (常量,但可以在构造函数中设置)System.ComponentModel.ReadOnlyAttribute
,但是文档非常有限,它看起来不像readonly
,但更像是可以在用户代码中查询的属性。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); }
};
我解释正确吗?有谁知道如何优雅地解决这个问题?预先感谢。
一种方法是在接口中声明一个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; }