我理解可选参数,我非常喜欢它们,但我想更多地了解如何使用继承接口。
展览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");
}
答案 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
获取默认值,然后调用方法。