Вопрос дизайна - несколько классов с одинаковой функциональностью - PullRequest
0 голосов
/ 23 июня 2019

Мне нужно кое-что прояснить для себя, поэтому, пожалуйста, потерпите меня.

Допустим, я хочу иметь объект, который взорвется через определенный промежуток времени. Если объект взрывается, когда человек все еще держит его, вас убивают.

Рассмотрим следующую реализацию:

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 ]

1 голос
/ 23 июня 2019

Наличие базового класса, который обеспечивает общие функциональные возможности для объектов, является общим и рекомендуемым в 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;
    }
}
1 голос
/ 23 июня 2019

Вы можете создать абстрактный класс ExplodableDevice и получить от него Bomb и Backpack.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...