我有一个带有默认参数的接口,我想从实现类中调用实现方法(除了从外部调用)。 我还想使用其默认参数。
但是,如果我只是按名称调用该方法,我无法使用默认参数,因为它们仅在接口中定义。我可以在实现方法中重复默认规范,但由于DRY和所有详细信息(特别是编译器不会检查它们是否与接口的默认值匹配!),这不太可能。
我通过引入名为_this
的成员来解决这个问题,该成员与this
相同,只是声明为接口类型。 然后,当我想要使用默认参数时,我使用_this
调用该方法。以下是示例代码:
public interface IMovable
{
// I define the default parameters in only one place
void Move(int direction = 90, int speed = 100);
}
public class Ball: IMovable
{
// Here is my pattern
private readonly IMovable _this;
public Ball()
{
// Here is my pattern
_this = this;
}
// I don't want to repeat the defaults from the interface here, e.g.
// public void Move(int direction = 90, int speed = 100)
public void Move(int direction, int speed)
{
// ...
}
public void Play()
{
// ...
//This would not compile
//Move();
// Now I can call "Move" using its defaults
_this.Move();
// ...
}
}
这种模式有什么问题或更好的解决方法吗?(顺便说一下,我认为这是语言的一个缺陷,我必须做类似这样的事情)
编辑:不是Why are C# 4 optional parameters defined on interface not enforced on implementing class?的重复... 我主要是在问如何绕过这个语言怪癖,而不是询问为什么它被设计成这样。
null
(对于值类型使用Nullable<T>)来解决。然后,每个实现都可以使用??
来默认到实际默认值...例如,在接口中int? direction = null
,实现可以从direction = direction ?? 90
开始,以默认为90。 - JoelFan