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
Hello, I'm a woman
Hello
