首页 > 解决方案 > 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*/ };
}

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

先感谢您。如果需要进一步澄清,我会尽快回复。

标签: c#interfacepolymorphism

解决方案


你为什么要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接口是什么。


推荐阅读