设计问题-具有相同功能的多个类

时间:2019-06-23 10:17:09

标签: c# unity3d design-patterns

我需要为自己澄清一些事情,所以请多多包涵。

比方说,我想要一个在一段时间后会爆炸的物体。如果该物体在有人手持时爆炸,您将被杀死。

让我们考虑以下实现:

public interface IKillable
{
    void Kill();
}

public interface IExplodable : IKillable
{
     float TimeLeft { get; set; }
     void Timer(float timeToExplode);
}

public abstract class Bomb: IExplodable
{
    public float TimeLeft { get; set; }

    public void Kill()
    {
        //Destroy the object
    }

    public void Timer(float timeLeft)
    {
        if (TimeLeft <= 0) {

            Kill();
        }
    }
}

如果我也想添加一个具有完全相同功能的“背包”而不是“炸弹”,或者可能爆炸(杀死)的任何其他物品怎么办?

  1. 在这种情况下,继承“炸弹背包”是否合理?
  2. 可能复制代码不会遵循SOLID原则吗?

2 个答案:

答案 0 :(得分:1)

您可以创建一个抽象ExplodableDevice类,并从其中继承BombBackpack

答案 1 :(得分:1)

在Unity中,同时建议使用具有为对象提供通用功能的基类。

与其调用类Bomb,不如调用类ExplodableDevice(如@zmbq回答),它更通用。但是,我将更明确地指出设备由于计时器而爆炸,因此可能是TimerExplodableDevice。请注意,基类应该从MonoBehaviour继承,否则您将无法完全使用这些对象(因为c#不允许多重继承)。

这种实现的一个例子是:

public interface IKillable
{
    void Kill();
}

public interface IExplodable : IKillable
{
     float TimeLeft { get; set; }
     void Timer(float timeToExplode);
}

public abstract class TimerExplodableDevice: MonoBehaviour, IExplodable
{
    public float TimeLeft { get; set; }

    public virtual void Kill()
    {
        //Destroy the object
    }

    public virtual void Timer(float timeLeft)
    {
        if (TimeLeft <= 0) 
        {
            Kill();
        }
    }
}

// this should be in a "Devices" folder, or otherwise be called appropriately
public class Backpack : TimerExplodableDevice
{
    void Start()
    {
        TimeLeft = 100;
    }
}

// this should be in a "Devices" folder, or otherwise be called appropriately
public class Bomb : TimerExplodableDevice
{
    void Start()
    {
        TimeLeft = 10;
    }
}