C#多个类似的重载问题

时间:2010-01-27 13:40:24

标签: c# overloading

方案

为了从基类中实例化两个不同的派生对象,我需要以下两个重载。

问题

编译器对此代码有问题,因为这些方法不明确 - 都将两个字符串作为参数。

问题

如何解决此问题,以便下面的代码编译?

代码

    public RateInstrument(string ric, string tenor)
    {
        Ric = ric;
        Tenor = tenor;
    }

    public RateInstrument(string ric, string date)
    {
        Ric = ric;
        Date = ConvDate(date);
    }

9 个答案:

答案 0 :(得分:4)

更改第二个以接受日期。这是对的,而且是对的。

答案 1 :(得分:3)

(我认为确实有意义地接受日期作为字符串,而“ric”意味着你的域名。这肯定是一个足够普遍的问题。)

你不能这样做,因为两个构造函数具有相同的签名,但一个很好的解决方法是使用静态工厂方法:

private static RateInstrument(string ric, string tenor, string date)
{
    ...
}

public static RateInstrument FromRicAndTenor(string ric, string tenor)
{
    return new RateInstrument(ric, tenor, null);
}

public static RateInstrument FromRicAndDate(string ric, string date)
{
    return new RateInstrument(ric, null, date);
}

静态构造方法的优点:

  • 并不总是必须返回一个新实例(它可以应用池等)
  • 如果确实有用,可以返回null
  • 可以比构造函数更容易在构造之前和之后完成有用的工作

缺点:

  • 当你习惯称呼“新”
  • 时看起来很奇怪
  • 继承可能会变得更加棘手(对于非嵌套的派生类型,您必须至少使构造函数受到保护)

(当然,与实际工厂类型的实例方法相比,这两者都缺乏可注射性。)

答案 2 :(得分:2)

为什么不简单地使用带有3个参数的构造函数?

public RateInstrument(string ric, string tenor, string date)
{
    Ric = ric;
    if (!string.IsNullOrEmpty(tenor))
    {
            Tenor = tenor;
    }

    if (!string.IsNullOrEmpty(date))
    {
        Date = ConvDate(date);
    }
}

答案 3 :(得分:1)

有两个不同的功能:

RateInstrumentFromDate(嗒嗒,日期)

RateInstrumentFromTenor(嗒嗒,男高音)

答案 4 :(得分:1)

方法签名(包括构造函数)不受参数名称的影响。 您将不得不更改其中一个构造函数,可能:

    public RateInstrument(string ric, string tenor) 
{ 
    Ric = ric; 
    Tenor = tenor; 
} 

public RateInstrument(string ric, TypeOfDate date) 
{ 
    Ric = ric; 
    Date = date; 
} 

答案 5 :(得分:0)

你需要给这两个构造函数提供不同的签名,而这两个签名都是

foo(string, string);

否则,您(更不用说编译器)如何知道您打算调用哪种方法?

您也可以将它们放在不同的类上,或者您可以更改传递给第二个构造函数的类型,例如以下两者都可以作为您的第二个方法:

public RateInstrument(string ric, string tenor, string date)
public RateInstrument(string ric, DateTime date)

如果这些都不适用于您的情况(例如,因为tenordate是互斥的),那么您应该再看一下您班级的设计,以及是否第二种情况应该在另一个班级处理。

我经常使用的另一个替代方法是将日期之类的设置延迟到构造函数之后 - 再次取决于您的类的设计。

答案 6 :(得分:0)

创建两个静态方法,为您创建对象:

static RateInstrument NewRateInstrumentByTenor(string ric, string tenor) {
   return new RateInstrument {
      Ric = ric,
      Tenor = tenor
   }
}
static RateInstrument NewRateInstrumentByDate(string ric, string date) {
   return new RateInstrument {
      Ric = ric,
      Date = ConvDate(date)
   }
}

答案 7 :(得分:0)

这里有一些可能的选择。没有看到更多的背景,我不能说哪个更好,但这里有一些。

  1. 将日期参数从字符串更改为正确的Date对象,以区分这两个签名。

  2. 对两者使用相同的构造函数,并使用DateTime.TryParse行中的某些内容来确定第二个参数是日期还是期限。

  3. 使用工厂方法而不是构造函数,以便命名不同。

  4. 创意1和3假设调用代码知道您尝试创建哪种类型的对象。 Idea 2允许该类保持通用并自行决定。

    关于这个问题我只是2¢。

答案 8 :(得分:0)

您不能拥有两种具有相同签名的方法。签名包括:

  • 方法的名称
  • 参数数量
  • 参数的数据类型和顺序
  • 参数修饰符

注意:返回类型不是签名的一部分。此外,参数的类型顺序是重要的,而不是它们的名称。

您可以考虑更改参数的数据类型,该参数使string date采用DateTime对象而不是字符串。这将改变第二种方法的签名。