gpt4 book ai didi

c# - 避免重复接口(interface)的默认值

转载 作者:可可西里 更新时间:2023-11-01 08:47:40 25 4
gpt4 key购买 nike

我有一个带有默认参数的接口(interface),我想从实现类的内部调用实现方法(除了从外部)。我也想使用它的默认参数。

但是,如果我只是按名称调用方法,我就不能使用默认参数,因为它们只在接口(interface)中定义。我可以在实现方法中重复默认规范,但由于 DRY 和所有这些细节,这不太可能(尤其是编译器不会检查它们是否与接口(interface)的默认值匹配!)

我通过引入一个名为 _this 的成员来解决这个问题,它与 this 相同,只是它被声明为接口(interface)类型。然后当我想使用默认参数时,我用 _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? 的副本...我主要是问如何解决这个语言怪癖,而不是问为什么它是这样设计的

最佳答案

您有三个选择。

默认使用扩展方法

public interface IMovable
{
void Move(int direction, int speed);
}

public static MovableExtensions
{
public static void Move(this IMovable movable)
{
movable.Move(90, 100);
}
}

显式实现接口(interface)

这样您就不必重复 IMovable 接口(interface)中定义的默认值,并且接口(interface)和实现的默认值永远不会不同步。

public class Ball : IMovable
{
void IMovable.Move(int direction, int speed)
{
}
}

重复默认参数

public class Ball : IMovable
{
public void Move(int direction = 90, int speed = 100)
{
}
}

您的代码可能有两个用户:一个只使用 IMovable 接口(interface),另一个只使用 Ball 类。可以说可能存在一个模糊的场景,其中移动 IMovable 的默认值应该不同于移动 Ball 的默认值,并且用户都不必关心默认值他们没有在看。

我承认这个解释不是很令人满意。如果您想了解有关为什么以这种方式设计语言的更多信息,请阅读 Giorgi Nakeuri 在他对您的问题的评论中链接到的问题和最佳答案:Why are C# 4 optional parameters defined on interface not enforced on implementing class?

关于c# - 避免重复接口(interface)的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37149723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com