【问题标题】:C# - Select and use different types of objects in a uniform wayC# - 以统一的方式选择和使用不同类型的对象
【发布时间】: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


【解决方案1】:

为什么你的ObjectType2 实现了接口ISelectable?不需要的时候可以去掉。

或者如果你想要一个通用的接口,你可以试试这些接口定义:

public interface ISomeEmptyInterface
{
}

public interface ISelectable : ISomeEmptyInterface
{
    void DoSomething();
}

更改选择器类:

public class Selector
{
    public ISomeEmptyInterface myObj;

    public void PerformAction()
    {
        if(myObj is ISelectable)
        {
            (myObj as ISelectable).DoSomething();
        }
    }
}

类实现单独的接口:

public class ObjectType1 : ISelectable
{
    public void DoSomething() 
    { 
        Console.WriteLine("ObjectType1 is called");
    };
}

public class ObjectType2 : ISomeEmptyInterface
{
    // no any implementation
}

一个简单的程序:

Selector sel1 = new Selector();
sel1.myObj = new ObjectType1();
sel1.PerformAction();
// output "ObjectType1 is called"

Selector sel2 = new Selector();
sel2.myObj = new ObjectType2();
sel2.PerformAction();
// not thing happened

这个缺点是你的Selector必须知道其他子ISomeEmptyInterface接口是什么。

【讨论】:

    猜你喜欢
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    相关资源
    最近更新 更多