【发布时间】:2020-08-11 01:04:26
【问题描述】:
这是我第一次在这里发帖,而且我对编程还比较陌生,所以我可能没有完全理解我打算使用的概念,例如接口或多态性。
我目前正在构建一个小游戏,玩家可以在其中选择不同类型的对象,我正在努力想出一个强大的选择系统。它现在的工作方式是通过一个接口,由玩家可以选择的每种类型的对象实现。
public interface ISelectable
{
void DoSomething();
}
然后,该接口用于根据鼠标点击或按键等不同事件调用当前选择的实现方法。
public class Selector
{
public ISelectable selection;
public PerformAction()
{
selection.DoSomething();
}
}
根据对象的类型,这些方法以不同的方式实现。但是,我遇到过某些情况,我不需要某种类型的对象来响应事件,因此不需要实现接口上定义的方法。
public class ObjectType1 : ISelectable
{
public void DoSomething() { /*Implemented*/ };
}
public class ObjectType2 : ISelectable
{
public void DoSomething() { /*Not needed*/ };
}
这使我相信这可能不是解决此问题的正确方法。因此,我有几个问题:
-
能否修正或改进我的方法,使其更有意义,并且我不会再次遇到之前描述的情况?
-
如果没有,是否有“正确”或更简单的方法来进行这种选择系统?
提前谢谢你。如果需要进一步澄清,我会尽快回复。
【问题讨论】:
-
DoSomething是不是大多数ISelectable对象都需要实现的方法?如果没有,则将其从界面中删除。ObjectType2真的适合ISelectable类型吗?如果没有,不要让它实现接口。否则,将接口实现的一部分留空就可以了(IMO)。但是,这确实使它成为一个基于意见的问题,这与堆栈溢出无关。 -
您总是可以只拥有一个基类
Selectable: ISelectable并提供一个默认实现,并且只在必要时使用override关键字覆盖它 -
另外,正如@RufusL 指出的那样,您需要衡量大多数
ISelectable是否需要DoSomething。如果他们不这样做,请添加一个IDoSomething接口,然后在您的Selector中执行if (this.selection is IDoSomething) { ((IDoSomething)this.selection).DoSomething(); }之类的操作
标签: c# interface polymorphism