我的重载应该如何明确?

时间:2009-03-30 16:08:48

标签: c# parameters constructor wrapper overloading

我正在构建一个用于C#的jquery插件的包装器,我不喜欢[Optional]的用法,因为它不像它所说的那样“可选”(意味着你仍然需要声明System.Missing库)所以我决定使用重载方法。我想给用户很多自定义,但我不确定我应该对我的重载有多明确。我是否应该根据参数的重要性对其进行细分,或者针对每种情况进行重载。

  • 什么是超载的足迹?
  • 效率会降低吗?
  • 对于OOP而言,这是不赞成的吗?

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

    2 个答案:

    答案 0 :(得分:2)

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

      

    对于OOP而言,这是不赞成的吗?

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

      

    效率会降低吗?

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

    答案 1 :(得分:1)

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

    E.g。

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