据我所知,这种类型的构造不是通常的C#习惯用法,但是我试图尽可能地模拟现有API的接口。
我最初的想法是拥有一个私有嵌套类的公共实例。但是,这会导致有关可访问性不一致的错误。在某种程度上,这是有道理的,消费者需要查看类定义才能知道可以调用哪些方法。
我希望该库可通过以下界面使用:
Web3 web3 = new Web3(new HttpProvider("hostname"));
string apiVersion = web3.Version.Api;
string transactionResponse = Web3.Eth.SendTransaction(transaction);
这种类型的接口与Ruby或JavaScript中的课程相当,只是很难弄清楚C#的等效语言。
嵌套类的部分将取决于Web3的特定实例化(它们取决于从连接到的特定RPC节点检索到的信息)
我实现该想法的第一个想法是:
public class Web3
{
public readonly VersionInfo Version;
private class VersionInfo
{
public readonly string Api = "2.0";
}
}
当然,这会导致不一致的可访问性错误。
具有内部可见性的独立类由于相同的原因而无法正常工作。
有没有办法做到这一点?创建一个用外部类实例化的类,但不能单独实例化吗?
答案 0 :(得分:2)
一种方法是将类完全私有,并返回一个接口:
private class VersionInfo : IVersionInfo
{
public string Api { get { return "2.0"; } }
}
public interface IVersionInfo
{
string Api { get; }
}
然后将Web3
中的定义从VersionInfo
更改为IVersionInfo
。
或者,您也可以这样做,以使该类不能**在库外实例化或扩展:
// Sealed to stop it being extended
public sealed class VersionInfo
{
// Internal to stop it being instantiated outside the library
internal VersionInfo()
{
}
public readonly string Api = "2.0";
}
**我说不能,但是有决心的人可以使用反射创建实例。但是,这不是您可以避免的。