2013-10-06 5 views
0

«Создайте программу с именем« DemoSquare », которая инициирует массив из 10 квадратных объектов со сторонами, которые имеют значения 1 -10 и отображают значения для каждого квадрата. Класс Square содержит поля для область и длину стороны, а также конструктор, для которого требуется параметр для области и длины стороны. Конструктор назначает свой параметр длине стороны Square и вызывает частный метод, который вычисляет поле области. свойства только для чтения, чтобы получить квадратную сторону и область ».Проблемы с readonly и private методами

Теперь я думаю, что это вопрос с подвохом, как я не могу получить частный метод для вычисления площади из-за присвоения только для чтения, но вот мой код:

class demoSquares 
    { 

     static void Main(string[] args) 
     { 
      Square[] squares = new Square[10];//Declares the array of the object type squares 
      for (int i = 0; i < 10; i++) 
      { 
       //Console.WriteLine("Enter the length"); 
       //double temp = Convert.ToDouble(Console.ReadLine()); 
       squares[i] = new Square(i+1);//Initializes the objects in the array 
      } 

      for (int i = 0; i < 10; i++) 
      { 
       Console.WriteLine(squares[i]); 
      }//end for loop, prints the squares 
     }//end main 

     }//end class 

Это площади Класс:

public class Square 
    { 

    readonly double length; 
    readonly double area; 

    public Square(double lengths)//Constructor 
    { 
     length = lengths; 
     area = computeArea(); 
    } 

    private double computeArea()//getmethod 
    { 
     double areaCalc = length * length; 
     return areaCalc; 
    } 
} 
+0

Да, я получил его, выполнив метод доступа, а не объявляя параметр area как readonly, но упражнение кажется очень специфичным. В главе рассказывалось об аксессуарах и классах, но я не понимаю, почему наш лектор будет использовать то, что не работает? –

ответ

7

Не путайте только для чтения свойства с полями только для чтения.

public class Square 
    { 
     public Square(double lengths) 
     { 
      Length = lengths; 
      Area = computeArea(); 
     } 

     //Read only property for Length (privately settable) 
     public double Length {get; private set;} 

     //Read only property for Area (privately settable) 
     public double Area {get; private set;} 

     //Private method to compute area. 
     private double ComputeArea() 
     { 
      return Length * Length; 
     } 
    } 
0

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

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

+0

Я вижу логику там, но теперь, когда вы показываете этот объект, он просто показывает тип, когда я вызываю его в классе DemoSquares –

2

Вопрос упоминает свойства readonly, а не поля только для чтения.

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

public class Square 
{ 
    // Readonly field, can only be assigned in constructor or initializer 
    private readonly double _sideLength; 

    // Readonly property since it only contains a getter 
    public double SideLength { get { return _sideLength; } } 

    // Readonly property from outside the class since the setter is private 
    public double Area {get; private set;} 

    public Square(double sideLength) 
    { 
     _sideLength = sideLength; 
     CalcSquare(); 
    } 

    private void CalcSquare() 
    { 
     this.Square = _sideLength * _sideLength; 
    } 
} 
0

Вы присваивание никогда не говорил, ваша частная функция должна назначить область. Он сказал, что конструктор должен назначить область с результатом частного метода:

public class Square 
{ 
    private readonly double length; 
    private readonly double area; 

    public Square(double length) 
    { 
     this.length = length; 
     this.area = computeArea(length); // assignment of area in constructor! 
    } 

    private double ComputeArea(double length) 
    { 
     return length * length; 
    } 
} 
2

только для чтения переменной действительно могут быть назначены в конструкторе, но не в методах, называемых от constrctor. Есть способы сделать это, то есть: link. Правильный способ - рассчитать площадь и сохранить результат в переменной области.

Я считаю, однако, что смысл был другим в вопросе. Цитирование:

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

значение означает, что вы используете Properties. Значение, вы должны использовать частные переменные для length и area и реализовать ПОЛУЧИТЬ только свойство для каждого:

public double Area 
{ 
    get 
    { 
     return area; 
    } 
} 
Смежные вопросы