2016-11-11 1 views
-1

Я пишу видео-игру, используя C# (и движок Unity). Это игра с большим количеством пушек, и вот как я планирую ее архитектовать ...Новое на C# от JS/Python ... Как сделать Duck Typing в C#?

У меня есть базовый класс Gun. Это обрабатывает все обычные вещи, например, сколько выстрелов в секунду можно стрелять, сколько у вас боеприпасов и т. Д.

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

Затем, на другой стороне моей кодовой базы, у меня есть контроллер джойстика.

Мой план состоял в том, чтобы передать экземпляр пистолета на контроллер джойстика. Джойстик говорит: «Эй, пистолет, стреляй так». Пистолет заботится обо всем остальном.

Проблема в том, что C# строго типизирован. Итак, что мне делать? Мои пушки отличаются друг от друга, что они разные классы, поэтому я не могу сказать своему джойстику, для чего пишут память.

Что мне здесь не хватает? В JS или Python я просто передал пистолет, и языку было бы все равно, что этот тип является подклассом, потому что у него все еще есть метод «огонь» ... Мысли?

Спасибо!

+3

C# не имеет утиную печать. Вы можете использовать наследование и полиморфизм. Создайте надбавку asbtract для всех орудий и используйте это. –

+0

Для Unity я рекомендую использовать для этого интерфейс. – Serlite

ответ

2

В C# и многих других языках, вам implement an interface или create a subclass

+0

Идите по интерфейсу. Таким образом, вы можете сделать модульные тесты, которые проверяют, работают ли вещи. –

0

Что я здесь отсутствует? В JS или Python я просто передал пистолет, и языку было бы все равно, что этот тип является подклассом, потому что у него все еще есть метод «огонь» ... Мысли?

Базовый класс должен либо иметь свой собственный метод виртуального огня, который переопределяется дочерними классами, либо он должен определять абстрактный метод (который заставляет любой дочерний класс реализовать его). Кроме того, вы можете создать интерфейс, а затем ваш класс контроллера может использовать любой класс, который реализует этот интерфейс.