Unity 3D Поліморфізм

2075 / Unity / 2D / 3D / Шаблони / Поліморфізм

 

Наслідування – робить функції доступними усім,

а поліморфізм, на додаток, дозволяє різну реалізацію цих функції

Ми можемо покласти дітей у масив об'єктів батьківського класу (звірі, монстри, герої),

і при цьому зберегти доступ до різноманіття функцій дітей;

при натисканні на них – вони будуть реагувати по різному

Усі персонажі вітаються, а ми хочемо додати скрипти з особливостями:

+ змінюють колір

+ стають більшими

+ нахиляються вперед 

то ми можемо на них додати нащадків і отримати такі можливості:

  • мати лише функціонал батька
  • мати лише власний функціонал
  • мати власний + батьківський функціонал

Прибирає ціпочки if з коду

  • if (Я == Людина-павук) — стріляти павутиною
  • if (Я == Супермен) — стріляти лазером
  • if (Я == Аквамен) — стріляти водою

 

 



Приклад з ігровими об'єктами

Базовий клас
public class M : MonoBehaviour
{
  public Rigidbody2D rb;

  void Start()
  {
    rb = GetComponent<Rigidbody2D>();
  }

  void OnMouseDown()
  {
    Trigger();
  }

  public virtual void Trigger() {
    rb.AddForce(new Vector2(0f, 300f));
  }
}

 
Монстр 1
public class M1 : M
{
  public override void Trigger()
  {
    base.Trigger();
    rb.AddForce(new Vector2(50f, 0f));
    transform.Rotate(0f, 0f, 10f);
  }
}

 
Монстр 2
public class M2 : M
{
  public override void Trigger()
  {
    base.Trigger();
    transform.localScale += Vector3.one * 0.1f;
  }
}

 
Монстр 3
public class M3 : M
{
  public override void Trigger()
  {
    base.Trigger();
    rb.AddForce(new Vector2(-50f, 0f));
    transform.Rotate(0f, 0f, -10f);
  }
}

 

Викликати усіх разом
foreach (var item in FindObjectsOfType<M>())
{
  item.Trigger();
}

 

 


 

Приклад без ігрових об'єктів
 
Базовий клас
public class Person
{
  public virtual void F1()
  {
    Debug.Log("Hello");
  }
}
 
public class Man : Person
{
  public override void F1()
  {
    Debug.Log("Hello, I'm a man");
  }
}
  
 
public class Woman : Person
{
  public override void F1()
  {
    Debug.Log("Hello, I'm a woman");
  }
}
 
  
public class Meeting : MonoBehaviour
{
  void Start(){
    Person[] arr = new Person[3];
    arr[0] = new Man();
    arr[1] = new Woman();
    arr[2] = new Person();

    foreach(var item in arr)
    {
      item.F1();
    }
  }
}

 

Hello, I'm a man
Hello, I'm a woman
Hello