我了解可选参数,我非常喜欢它们,但我想知道更多关于在继承接口中使用它们的信息。
附件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");
}

最佳答案

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

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

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

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

08-07 13:03