C # Вызов переопределенного метода в суперклассе - PullRequest
3 голосов
/ 03 марта 2011

Привет.Я только что подобрал C # для изучения игрового программирования на XNA, но у меня также есть некоторый опыт работы с Java.

Вот мой код, по сути:

public class A
{
    public Rectangle getRectangle()
    {
        return [some rectangle];
    }

    public bool collision(A other)
    {
        Rectangle rect1 = getRectangle();
        Rectangle rect2 = other.getRectangle();
        return rect1.Intersects(rect2);
    }
}

public class B : A
{
    public Rectangle getRectangle()
    {
        return [some other rectangle];
    }
}

Проблема возникает, когда я что-то пробуювот так:

A a;
B b;
if(a.collision(b))
    ...

Где, на сколько я могу сказать, версия get get rectangle фактически никогда не вызывается.Я попробовал решение, подобное предложенному здесь , но сообщение, которое я получаю, в основном «B.getRectangle () скрывает унаследованный член A.getRectangle (). Используйте ключевое слово new, если это было задумано».

Я заранее ценю любую помощь, которую я получаю.Я думаю, что мой прошлый опыт Java мешает понять, как C # отличается.Я думаю, если кто-то просто знает о хорошей ссылке, которая объясняет различия между C # и java или просто как C # работает в этом отношении, этого может быть достаточно.

Приветствия.

Ответы [ 4 ]

6 голосов
/ 03 марта 2011

В отличие от Java, методы в C # не помечены как виртуальные по умолчанию.Ваш текущий код делает сокрытие метод getRectangle: в объявлении метода в производном классе есть неявный модификатор new.

Вам необходимо явно включитьмодификатор virtual в объявлении метода в базовом классе:

public virtual Rectangle getRectangle() { ... }

и override в производном классе с:

public override Rectangle getRectangle() { ... }
1 голос
/ 03 марта 2011

Вам необходимо использовать ключевое слово override для метода getRectangle в классе B, например:

public override Rectangle getRectangle()
0 голосов
/ 03 марта 2011

Я бы предложил использовать Override для изменения функциональности getRectangle () в B.

0 голосов
/ 03 марта 2011

Я не знаю Java, но я предполагаю, что у них есть какой-то виртуальный / переопределенный синтаксис для методов?

  public class A
  {
    virtual public Rectangle getRectangle()
    {
      return [some rectangle];
    }

    public bool collision(A other)
    {
      Rectangle rect1 = getRectangle();
      Rectangle rect2 = other.getRectangle();
      return rect1.Intersects(rect2);
    }
  }

  public class B : A
  {
     override public Rectangle getRectangle()
     { 
        return [some other rectangle];
     }
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...