【发布时间】:2019-11-08 12:50:18
【问题描述】:
我有一个带有 Bar 方法的 IFoo 接口,带有一个字符串参数。这个接口有一个实现,它返回一个常量值,根本不使用参数。另一个使用参数。
如何避免这个无用的参数? 这是一个虚拟实现
public interface IFoo
{
string Bar(string parameter);
}
public class Foo : IFoo
{
public string Bar(string parameter)
{
return string.Format("{0}Fooooooo", parameter);
}
}
public class ConstantFoo : IFoo
{
public string Bar(string parameter)
{
return "Baaaaaaar";
}
}
public class Caller
{
private readonly IFoo _foo;
private readonly IFoo _constFoo;
public Caller()
{
_foo = new Foo();
_constFoo = new ConstantFoo();
}
public void DummyUsage()
{
string arg = "Wololo";
Console.WriteLine(_foo.Bar(arg));
Console.WriteLine(_constFoo.Bar(arg));
}
}
【问题讨论】:
-
接口定义合约..你不是强制使用这个参数。另一种情况是例如事件。想象一下微软为您提供了一些事件。通常 eventhandler 方法有 2 个参数
void MyHandler(object sender, EventArgs e)一旦事件被触发,这个处理程序就会被调用并且 2 个参数在方法范围内可用。你可以使用它们,但没有强迫你使用它们的力量。如果您是界面的生产者,您也可以将其应用于界面(第 3 方),也许您可以考虑如何更改应用程序的设计。 -
接口是合约。当你有
IFoo的实例时,你只知道它有Bar(string),你不知道参数是否无用,你必须传递它。实现不使用也没关系,但还是要遵守约定,将此参数定义为方法签名。你可以给它一些花哨的名字,例如notUsed甚至给出可选的默认值(或使用重载),那么如果你有ConstantFoo实例,你可以不带参数调用Bar() -
Sinatr 评论示例:dotnetfiddle.net/I9rrkD
-
@Fildor 我认为在这种情况下可选参数不是好主意
-
@PeterM。我刚刚编译了一个 Sinatr 建议 OP 看到的示例。
标签: c# oop inheritance interface