代码之家  ›  专栏  ›  技术社区  ›  iCodeSometime Francesca

不一致的可访问性:使用私有嵌套类的公共实例的替代方法

  •  2
  • iCodeSometime Francesca  · 技术社区  · 8 年前

    就我所知,这种类型的构造不是通常的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";
        }
    }
    

    当然,这会产生不一致的可访问性错误。

    具有内部可见性的独立类不起作用的原因是相同的。

    有办法吗?创建一个用外部类实例化但不能自己实例化的类?

    1 回复  |  直到 8 年前
        1
  •  2
  •   ProgrammingLlama Raveena Sarda    8 年前

    一种方法是将类完全私有化,并返回一个接口:

    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";
    }
    

    **我说不行,但有决心的人可以使用反射创建实例。但这不是你能阻止的。