Использование наследования в C # для совместного использования функций - PullRequest
0 голосов
/ 26 марта 2012

Так что я новичок в идее наследования и интерфейсов, и я не уверен, как добиться того, что я пытаюсь сделать.

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

Итак, у меня есть класс символов, который наследуется классом статического игрока, но я не могу получить доступ к позиции, хотя класс Player говорит, что ссылка на объект обязательна.

Итак, как мне использовать наследование для разделения функций между игроком и ai, при этом все еще имея возможность доступа к переменным в классе символов через дочерние классы?

Ответы [ 5 ]

3 голосов
/ 26 марта 2012

В родительском классе «Character» необходимо, чтобы его непубличные члены были объявлены как «защищенные», а не «private», если вы хотите, чтобы дочерние классы могли иметь доступ к переменным. После этого вы просто используете ключевое слово "base" для ссылки на родителя, подобно тому, как вы используете "this" для ссылки на текущий экземпляр класса.

Например:

//note: abstract is not a pre-requisite for inheritance
abstract class Character
{
     protected float x;
     protected float y;
     protected float z;
     //etc etc
}

public class AIBasic : Character
{
    public void move()
    {
         //purely an example
         base.x++;
         base.y++;
         base.z++;
    }
}
2 голосов
/ 26 марта 2012

реализуйте свой базовый класс как абстрактный класс, а не статический класс.Статический метод без ссылки на реальный объект не сможет получить доступ к свойствам или полям объекта.

2 голосов
/ 26 марта 2012

Наследование - не лучшее решение этой проблемы.Вместо этого подумайте об использовании IoC (Inversion of Control) и создайте отдельные классы рисования и перемещения.Затем скомпонуйте их в единый символьный экземпляр.

Ninject - один из моих любимых инструментов IoC, и его руководство довольно полно.На самом деле он демонстрирует очень простой, но распространенный класс игровых персонажей.

https://github.com/ninject/ninject/wiki/Injection-Patterns

1 голос
/ 26 марта 2012

Итак, первое, что вы делаете, это определяете базовый класс.Если вы хотите никогда не создавать его экземпляр, вы можете создать абстрактный класс и затем разрешить переопределение свойств и методов:

// Marking the properties as virtual allow you to override their behaviour 'by design'. Their normal
// behaviour will continue to work if you choose not to
public abstract class Character
{
     protected virtual Point Position { get;set; }
     protected virtual int Direction {get;set; }
     protected virtual Image Texture { get;set; }
     protected virtual bool Visible { get; set; }

     // Define methods you would like to partially implement or let the other class do:
     public virtual void Rotate(int directionInDegrees)
     {
          this.Direction += directionInDegrees;
     }

     public abstract void Draw();
} 

// Then use inheritance to create the classes based on this
public class Player : Character
{
     public override void Rotate(int directionInDegrees)
     {
          // Implement character specific rotate
     }

     public void Draw()
     {
          // Must implement Draw(), so that we can instantiate the class properly.
          // All methods of an abstract class must be implemented before a class is deemed
          // valid to use instantiate directly.
     }
}

public class Enemy : Character
{
   public override void Rotate()
   {
   }
}

В ответ на «наследование» от статических классов вы не можете этого сделать.static методы принадлежат классу, а не экземпляру объекта, поэтому они не могут наследоваться.Они могут быть переопределены (с помощью ключевого слова new, чтобы показать, что вы переопределяете его), но вам придется реализовать это для каждого создаваемого вами класса.

Если вы хотите иметь возможность переопределять методы по умолчанию, вы должны написать методы как нестатические.

0 голосов
/ 26 марта 2012

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

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