2016-05-11 2 views
1

У меня проблемы с инкапсуляцией, и я не знаю, где проблема. Почему строка может быть изменена после ее создания? Это говорит мне, что что-то не так в моем «линейном классе» и должно быть инкапсулировано. Консультирование будет высоко оценено. При вызове «pa.X = 4» и «startpos.Y = 7» это не должно меняться для меня, но это так. Я ожидаю, что все строки не будут изменены, когда программа закончится.Закрытый доступ vs Public

Dotclass:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace Dot 
{ 
    class Dot 
    { 
     private int x; 
     private int y; 

     public Dot() 
     { 
      this.X = 0; 
      this.Y = 0; 

     } 
     public Dot(int x, int y) 
     { 
      this.X = x; 
      this.Y = y; 
     } 

     public int X 
     { 
      get 
      { return x; } 
      set { x = value; } 
     } 

     public int Y 
     { 
      get { return y; } 
      set { y = value; } 
     } 
    } 
} 

Lineclass:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace Dot 
{ 
    class Line 
    { 
     private Dot startdot; 
     private Dot enddot; 
     private double length; 

     public Line(Dot pa, Dot pb) 
     { 
      this.startdot = pa; 
      this.enddot = pb;    
     } 

     public double Size() 
     { 
      double a = (double)(enddot.X - startdot.X); 
      double b = (double)(enddot.Y - startdot.Y); 

      return length = Math.Sqrt(a * a + b * b);    
     } 

     public Dot Position() 
     { 
      return startdot; 
     } 

    } 
} 

Главная:

using System; 
    namespace Dot 
    { 
     class Program 
     { 
      public static void Main() 
      { 
       Dot pa = new Dot(); 
       Dot pb = new Dot(-10, -10); 
       Console.WriteLine("Dot pa, position = (" + pa.X + ", " + pa.Y + ")"); 
       Console.WriteLine("Dot pb, position = (" + pb.X + ", " + pb.Y + ")"); 
       Line line = new Line(pa, pb); 
       Print("Run 1 off line", line); 
       pa.X = 4; 
       Print("Run 2 off line", line); 
       Dot startpos = line.Position(); 
       startpos.Y = 7; 
       Print("Run 3 off line", line); 
      } 
      private static void print(string text, Line line) 
      { 
       double length = line.Size(); 
       Dot startPos = line.Position(); 
       Console.WriteLine("\n" + text); 
       Console.WriteLine("Längd = {0 :f4} length", length); 
       Console.WriteLine("Position = ({0},{1})", startPos.X, startPos.Y); 
       Console.ReadLine(); 
      } 
     } 
    } 
+0

Проблема в том, что класс 'Dot' изменчиво. У этого есть * есть *? Если нет, просто сделайте 'set' из' X' и 'Y' частным. Если по какой-либо причине 'Dot' * must * будет изменяться, вы можете позволить' Line' работать с «клоном». Например: 'public Line (Dot pa, Dot pb) {startdot = new Dot (pa.X, pa.Y); enddot = new Dot (pb.X, pb.Y); } ' – Corak

+0

Я попытался заменить мой конструктор Line этим, но значение изменилось – iscilcra

+0

Это потому, что ваш' set' of X является общедоступным. Даже ваши данные menber являются частными, но вы предоставляете общедоступный способ изменения другого частного x. – Kason

ответ

4

Почему линия может быть изменен после того, как она была создана?

Причина заключается в том, что class Dot является ссылка типа, и вы хотите значение типа, struct:

// please, notice "struct" 
    public struct Dot { 
    // you don't need separate fields, but properties 
    public int X {get; set;} 
    public int Y {get; set;} 

    public Dot(int x, int y) { 
     X = x; 
     Y = y; 
    } 
    } 

    .... 

EDIT: Я предлагаю поворот public Dot Position() в собственности а :

class Line { 
    ... 
    public Dot Position { 
    get { 
     return startdot; 
    } 
    set { 
     startdot = value; 
    } 
    } 
} 

и поэтому вы можете «контролировать углы»:

line.Position = new Dot(line.Position.X, 5); 
+0

Благодарим вас за ответ, однако Dot необходимо изменить. – iscilcra

+0

@iscilcra: 'Dot' является изменяемым,' Dot d = new Dot (1, 2); d.X = 123; d.Y = 456; ' –

+0

Спасибо. Извините за кажущееся требование, но он должен быть классом, и изменения должны быть сделаны на Lineclass. Я хочу контролировать все ракурсы. – iscilcra

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