可选参数和继承

时间:2011-11-11 13:25:55

标签: c# inheritance optional-parameters

我理解可选参数,我非常喜欢它们,但我想更多地了解如何使用继承接口。

展览A

interface IMyInterface
{
    string Get();
    string Get(string str);
}

class MyClass : IMyInterface
{
    public string Get(string str = null)
    {
        return str;
    }
}

现在我认为Get中的MyClass方法继承了接口的两种方法,但是......

  

'MyClass'没有实现接口成员'MyInterface.Get()'

这有充分的理由吗?

也许我应该通过在您说的界面中添加可选参数来解决这个问题?但是这个呢?

图表B

interface IMyInterface
{
    string Get(string str= "Default");
}

class MyClass : IMyInterface
{
    public string Get(string str = "A different string!")
    {
        return str;
    }
}

这段代码编译得很好。但那肯定不是正确的吗?然后再挖掘一下,我发现了这个:

  IMyInterface obj = new MyClass();
  Console.WriteLine(obj.Get()); // writes "Default"

  MyClass cls = new MyClass();
  Console.WriteLine(cls.Get()); // writes "A different string!"

似乎调用代码是根据声明类型的对象获取可选参数的值,然后将其传递给方法。对我来说,这看起来有点愚蠢。也许可选的参数和方法重载都有它们的场景应该使用它们吗?

我的问题

我的调用代码传递了IMyInterface的实例,需要在不同的位置调用这两种方法。

我是否会被迫在每个实现中实现相同的方法重载?

public string Get()
{
  return Get("Default");
}

1 个答案:

答案 0 :(得分:1)

我还没有意识到,可选参数 不会更改方法签名 。所以下面的代码完全合法,实际上是我的解决方案:

interface IMyInterface
{
    string Get(string str = "Default");
}

class MyClass : IMyInterface
{
    public string Get(string str)
    {
        return str;
    }
}

因此,如果我有MyClass的实例,我必须调用Get(string str),但如果该实例已被声明为基本接口IMyInterface,我仍然可以调用Get() },首先从IMyInterface获取默认值,然后调用方法。