Вытащите дочерний элемент из массива типа parent и используйте перезаписанный метод дочернего элемента. - PullRequest
1 голос
/ 01 февраля 2012
    public Block[,] Layer2ID;
    Layer2ID[X, Y].Draw(spriteBatch, new Vector2(X * 32, Y * 32)); //Child of Block, let's call it Wall

Layer2ID заполняется массивом потомков Блока, но имеет тип Блока, поэтому, когда я вызываю функцию рисования, он использует функцию рисования Блока вместо дочерней.Почему это так и как мне это исправить?

Спасибо.

1 Ответ

3 голосов
/ 01 февраля 2012

Из вашего описания звучит так, как будто у вас есть что-то вроде этого

class Block 
{
    public void Draw(SomeObj spriteBatch, Vector2 vector) { }
}

class Wall : Block
{
    public void Draw(SomeObj spriteBatch, Vector2 vector) { }
}

Метод внутри стены скрывает метод в блоке, он не является виртуальным. Вы можете даже иметь модификатор new для метода внутри Wall, так как компилятор обычно предупреждает вас о методе скрытия и рекомендует новое ключевое слово, чтобы отметить ваше намерение. Этот метод скрытия вызывается только через ссылку на стену, а не через ссылку на блок.

В отличие от Java, например, методы в C # не являются виртуальными по умолчанию, вы должны пометить их как таковые. Чтобы использовать ваши методы полиморфно, примените модификаторы virtual и override к методам базового и производного классов соответственно.

class Block 
{
    public virtual void Draw(SomeObj spriteBatch, Vector2 vector) { }
}

class Wall : Block
{
    public override void Draw(SomeObj spriteBatch, Vector2 vector) { }
}

С этим на месте метод переопределения будет вызван.

Block block = new Wall();
block.Draw(spriteBatch, vector); // should observe derived behavior
Layer2ID[x, y].Draw(spriteBatch, vector); // same, if this element is a Wall
...