У меня проблемы с инкапсуляцией, и я не знаю, где проблема. Почему строка может быть изменена после ее создания? Это говорит мне, что что-то не так в моем «линейном классе» и должно быть инкапсулировано. Консультирование будет высоко оценено. При вызове «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();
}
}
}
Проблема в том, что класс '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
Я попытался заменить мой конструктор Line этим, но значение изменилось – iscilcra
Это потому, что ваш' set' of X является общедоступным. Даже ваши данные menber являются частными, но вы предоставляете общедоступный способ изменения другого частного x. – Kason