Как привести объект к вызову метода? - PullRequest
4 голосов
/ 15 декабря 2011

У меня есть следующая иерархия классов:

public class AI {
    public AI() { }
    public virtual void Update(float frameTime) { }
}

public class Boss : AI {
    public Boss() : base() { }
    public override void Update(float frameTime) { 
        Console.WriteLine("Boss Update"); 
    }
}

У меня есть Персонаж, который содержит переменную ИИ, в которой я затем сохраняю экземпляр Boss и пытаюсь привести его в действие таким образом, чтобы получить функцию Обновления Босса, а не базового класса.

AI ai = new Boss();
(Boss)ai.Update(0f);

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

Ответы [ 3 ]

18 голосов
/ 15 декабря 2011

Оператор точка имеет более высокий приоритет , чем приведение, поэтому ваш код интерпретируется как:

(Boss)(ai.Update(frameTime));

Вам нужно добавить дополнительную пару скобок, чтобы получить то, что вы хотите:

((Boss)ai).Update(frameTime);

Однако выполнять приведение не обязательно, поскольку ваш метод является виртуальным.

Возможно, вы также захотите изменить тип AI на abstract class или (если возможно) интерфейс.

4 голосов
/ 15 декабря 2011

Вам понадобится добавить парены вокруг приведения и объекта приведения, чтобы вызвать метод для значения приведения (т. Е. ((SomeType)someObj).SomeMethod()), но это не относится к точке, поскольку приведение совершенно не нужно.

Update является виртуальным, а вызов полиморфным, поэтому, даже если переменная ai была объявлена ​​как экземпляр AI, она на самом деле вызовет Boss.Update(), поскольку именно этот тип на самом деле скрыт.

Именно поэтому полиморфизм так силен.Вам не нужно знать, что является базовым типом, чтобы получить правильное, специфичное для реализации поведение.

0 голосов
/ 15 декабря 2011

То, что говорит ваша строка кода:

AI ai = new Boss();
(Boss)ai.Update();

- это взять то, что возвращается от Update();, и привести его к типу Boss

, что вам нужно сделать, это

AI ai = new Boss();
((Boss)ai).Update();

, который приводится ai к типу Boss и вызывает метод Update().

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