2015-07-13 8 views
1

Я делал некоторое чтение here о создании неизменяемого объекта в java, и мне было интересно, можно ли создать изменяемый объект в определенных ситуациях?C# Неизменяемые классы и игровые объекты

Например, предположим, что мы создавали в пинг-понг игры в C#, очевидно, мы бы класс, который представляет собой шар, и два весла, вы бы написать класс мяч так:

class Ball 
    { 
     private readonly int xPosition; 
     private readonly int yPosition; 
     private readonly int ballSize; 
     private readonly string ballColor; 

     public Ball(int x, int y, int size, string color) 
     { 
      this.xPosition=x; 
      this.yPosition=y; 
      this.ballSize = size; 
      this.ballColor = color; 
     } 

     public int getX 
     { 
      get 
      { 
       return this.xPosition; 
      } 
     } 
     //left out rest of implementation. 

или как это:

class Ball 
    { 
     private int xPosition; 
     private int yPosition; 
     private int ballSize; 
     private string ballColor; 

     public Ball(int x, int y, int size, string color) 
     { 
      this.xPosition=x; 
      this.yPosition=y; 
      this.ballSize = size; 
      this.ballColor = color; 
     } 

     public int getX 
     { 
      get 
      { 
       return this.xPosition; 
      } 

      set 
      { 
       this.xPosition = value; 
      } 
     } 


    } 
} 

в ситуации, когда наш объект (мяч), может изменить положение, размер (больше или меньше, в зависимости от уровня) и цвета, не было бы лучше, чтобы обеспечить сеттер недвижимость ? В этом случае сделать его изменчивым имеет смысл? Как бы вы к этому подошли?

+1

Если мяч для пинг-понга должен был плавать в воздухе так же, как кирпичи, тогда это было бы нормально. Другими словами, если он не перемещается, сделайте его неизменным. Но неперемещающийся мяч для пинг-понга не так забавен, поэтому, возможно, изменчивый способ пойти, в комплекте с сеттерами. :) – MickyD

+0

Итак, мой второй подход логичен, правильно? –

+1

Думаю, что да. – MickyD

ответ

5

Если вы используете C#, вам не нужно идти через накладные расходы на создание отдельных полей, чтобы объекты неизменяемы. Вместо этого вы можете сделать что-то вроде этого -

class Ball 
    { 
     public Ball (int x, int y, int size, string color) 
     { ... } 
     public int XPos {get; private set; } 
     public int YPos {get; private set; } 
     public int Size {get; private set; } 
     public string BallColor {get; private set; } 
    } 

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

+0

AH, именно то, что я имел в виду, но просто хотел убедиться. Ответ принят! –

+0

Как он адресует _ «В ситуации, когда наш объект (шар) может изменять положение, размер (меньше или больше в зависимости от уровня) и цвет **, не лучше ли было бы установить ** setter ** свойство? В этом случае сделать его изменчивым имеет смысл? Как бы вы к этому подошли? »_. Было бы неплохо, если бы просто «ball.XPos = ...» – MickyD

+0

Вы всегда можете добавлять функции в класс Ball, например Move (int x, int y), которые позволяют перемещать мяч в определенную позицию. В этих функциях может выполняться выборочная проверка входов и т. Д. До того, как будут заданы значения свойств. Таким образом, вы можете ограничить, как другие классы взаимодействуют с экземпляром Ball. – KnightFox

Смежные вопросы