繁体   English   中英

私人可访问与公共

[英]Private accessible vs Public

我在封装方面遇到问题,但问题不在哪里。 创建线后为什么可以更改它? 这告诉我“行类”中有什么问题,需要封装。 建议将不胜感激。 当调用“ pa.X = 4 ”和“ startpos.Y = 7 ”时,这应该不会改变我的行,但是会改变。 我希望程序完成后所有行都保持不变。

点类:

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; }
        }
    }
}

线类:

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();
            }
        }
    }

创建线后为什么可以更改它?

原因是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;
    }
  }

  ....

编辑:我建议也将public Dot Position()转换为属性

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

这样您就可以“控制角度”:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM