可选参数和继承

Con*_*ell 6 c# inheritance optional-parameters

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

图表A.

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

class MyClass : IMyInterface
{
    public string Get(string str = null)
    {
        return str;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我会认为该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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

  MyClass cls = new MyClass();
  Console.WriteLine(cls.Get()); // writes "A different string!"
Run Code Online (Sandbox Code Playgroud)

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

我的问题

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

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

public string Get()
{
  return Get("Default");
}
Run Code Online (Sandbox Code Playgroud)

Con*_*ell 3

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

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

class MyClass : IMyInterface
{
    public string Get(string str)
    {
        return str;
    }
}
Run Code Online (Sandbox Code Playgroud)

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