关于c#:可选参数和继承

Optional parameters and inheritance

我了解可选参数,我非常喜欢它们,但我想知道更多关于将它们与继承接口一起使用的信息。

附件A

1
2
3
4
5
6
7
8
9
10
11
12
13
interface IMyInterface
{
    string Get();
    string Get(string str);
}

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

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

'MyClass' does not implement interface member 'MyInterface.Get()'

这有充分的理由吗?

也许我应该通过将可选参数放入您所说的接口来实现这一点?但是这个呢?

附件B

1
2
3
4
5
6
7
8
9
10
11
12
interface IMyInterface
{
    string Get(string str="Default");
}

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

这段代码编译得很好。但这肯定是不对的?再挖一点,我发现了:

1
2
3
4
5
  IMyInterface obj = new MyClass();
  Console.WriteLine(obj.Get()); // writes"Default"

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

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

我的问题

我的调用代码被传递给IMyInterface的一个实例,需要在不同的点调用这两个方法。

是否将强制我在每个实现中实现相同的方法重载?

1
2
3
4
public string Get()
{
  return Get("Default");
}


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

1
2
3
4
5
6
7
8
9
10
11
12
interface IMyInterface
{
    string Get(string str ="Default");
}

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

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