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)
我也没有意识到,可选参数不会改变方法签名。所以下面的代码是完全合法的,实际上是我的解决方案:
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
,然后调用该方法。
归档时间: |
|
查看次数: |
1670 次 |
最近记录: |