C#-以统一的方式选择和使用不同类型的对象

问题描述

这是我第一次在这里发帖,我对编程还很陌生,所以我可能没有完全理解我打算利用的概念,例如接口或多态性。

我目前正在开发一款小游戏,玩家可以在其中选择不同类型的对象,而我正在努力设计出功能强大的选择系统。现在它的工作方式是通过界面,玩家可以选择每种类型的对象来实现。

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*/ };
}

这使我相信这可能不是正确的方法。因此,我有几个问题:

  • 我的方法是否可以修复或改进,以使其更有意义,而我不会再遇到上述情况?

  • 如果没有,是否有“正确”或更简单的方法来进行这种选择系统?

先谢谢您。如果需要任何进一步的说明,我将尽快答复。

解决方法

您的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子接口。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...