1

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

  • 超载的足迹是什么?
  • 会不会降低效率?
  • 在 OOP 方面是否不受欢迎?

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

    4

    2 回答 2

    2

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

    在 OOP 方面是否不受欢迎?

    OOP 支持单一职责原则或 SRP。如果您有一个包含许多这些函数的类,每个类都有许多重载,这表明它可能做的太多了。

    会不会降低效率?

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

    于 2009-03-30T16:17:59.420 回答
    1

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

    例如

    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 });
    
    于 2009-03-30T16:38:06.050 回答