Из вашего описания звучит так, как будто у вас есть что-то вроде этого
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