【问题标题】:how explicit should I be with my overloads?我的重载应该有多明确?
【发布时间】:2009-03-30 16:08:47
【问题描述】:

我正在为 C# 的 jquery 插件构建一个包装器,我不喜欢 [Optional] 的使用,因为它不像它所说的那样“可选”(这意味着您仍然必须声明 System.Missing 库)所以我决定使用重载方法。我想给用户很多自定义,但我不确定我的重载应该有多明确。我应该根据参数的重要性来分解它还是对每个场景都进行重载。

  • 过载的足迹是什么?
  • 效率会降低吗?
  • 在 OOP 方面是否令人不悦?

  • PS 我正在调用基类的构造函数并且必须使用 base(param1, param2, ...) 方法,但我也想使用 this(param1, param2, ...) 而不是必须在每个场景中初始化我的成员变量,是否有解决办法?

    【问题讨论】:

      标签: c# parameters constructor wrapper overloading


      【解决方案1】:

      一个令人困惑的 API 是图书馆消费者的永恒祸根。 让人们可以根据您提供的界面轻松甚至是微不足道地决定他们想要做什么。如果他们必须从冗长的重载函数列表中进行选择,那可能是太多的认知开销。此外,值得注意的是,C# 4 将支持可选参数和命名参数,因此您的 System.Missing 问题将自行消失。

      在 OOP 方面是否令人不悦?

      OOP 支持 Single Responsibility Principle 或 SRP。如果您有一个包含许多此类函数的类,每个类都有许多重载,这表明它可能做的太多了。

      它会降低效率吗?

      如果同一方法有很多重载,静态解析每个函数调用需要更长的时间(即,“哪个方法使用这个名称是正确的?”)。但是,如果它们是非虚拟调用,则不会对性能产生运行时影响——也就是说,编译器可以静态地知道某些东西将是什么类型。不过,无论哪种方式,我认为这不应该是你的激励因素。

      【讨论】:

        【解决方案2】:

        如果您有很多参数并且需要可扩展,请考虑使用包含您的参数的类。

        例如

        public class FileOptions
        {
          public bool Indented { get; set; }
          public string Namespace { get; set; }
          public System.Text.Encoding Encoding { get; set; }
        }
        
        public void Save(string fileName, FileOptions options) { ... }
        
        // usage:
        
        obj.Save("a.xml", new FileOptions { Indented=true });
        obj.Save("b.xml", new FileOptions { Namespace="urn:foo", Encoding=System.Text.Encoding.UTF8 });
        

        【讨论】:

        • 我喜欢这种方法,但我唯一的问题是我希望基类中的覆盖方法在构造函数或对象初始化时启动。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-16
        • 2013-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-10
        • 1970-01-01
        相关资源
        最近更新 更多