一七年夏 2020-09-25 00:21 采纳率: 100%
浏览 92
已采纳

C# 请问如何解决仅修改对象的属性导致无法触发父对象对此对象的访问器的问题?

一个点对象:

public class Point
{
    public Point(){ }
    public Point(double X, double Y)
    {
        this.X = X;
        this.Y = Y;
    }
    public double X;
    public double Y;
}

一个用到点对象的部分

Point _point;
Point TestPoint
{
    get
    {
        return _point;
    }
    set
    {
        _point = value;
        Console.WriteLine("修改了TestPoint");
        //从这开始要执行很多操作
    }
}

执行的代码:

void Main()
{
    Console.WriteLine("第一次修改TestPoint");
    TestPoint = new Point(); 
    Console.WriteLine("第二次修改TestPoint");
    TestPoint.X = 1;
}

输出结果为:

第一次修改TestPoint
修改了TestPoint
第二次修改TestPoint

这怎么办?第二次修改后没有触发set访问器

我需要修改对象的属性时等同于修改了这个对象,有解决每次都要像这样 ↓ 来触发set访问器的方法吗?

Point pt = TestPoint;
pt.X = 1;
TestPoint = pt;



问题已解决

解决方案:

interface IFather
{
    List<IFather> Fathers { get; set; }
    void ChildsUpdated();
}
class Point : IFather
{
    double _x;
    double X
    {
        get
        {
            return _x;
        }
        set
        {
            foreach(IFather father in Fathers) father.ChildChanged();
            _x = value;
        }
    }
    List<IFather> _fathers = new List<IFather>{ };
    public List<IFather> Fathers
    {
        get{ return _fathers;}
        set{ _father = value;
    }
    void ChildChanged() { }
}
class B : IFather
{
    void AFunction() //对象中的一个方法
    {
        Point point = new Point(1, 2, this)
        point.X = 3; //这里将通过ChlidChanged()方法代替未触发的访问器
    }

    List<IFather> _fathers = new List<IFather>{ };
    public List<IFather> Fathers
    {
        get{ return _fathers;}
        set{ _father = value;
    }

    void ChlidChanged()
    {
        //从这里开始做与未被触发的访问器相同的操作
    }

}

上面代码是简写的,可能有错误,比如public/private未清楚标注,CSDN的网页输入框太难用了。

  • 写回答

2条回答 默认 最新

  • jingluan666 2020-09-25 09:32
    关注

    上面set只是针对TestPoint对象本身,并不是针对它的某个属性,如果是针对属性可以这样

    其实这样就行了

    public class Point
    {
        private double _x;
        private double _y;
        public Point(){ }
        public Point(double X, double Y)
        {
            this.X = X;
            this.Y = Y;
        }
    
        public double X
            {  
               get {return this._x;}
                 set
                 {
                     this._x=value;
                         Console.WriteLine("修改了X");
                 }
            }
    
        public double Y
            {  
               get {return this._y;}
                 set
                 {
                     this._y=value;
                         Console.WriteLine("修改了Y");
                 }
            }
    }
    

    用在类本身的那个set可以不要了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 BP神经网络控制倒立摆
  • ¥20 要这个数学建模编程的代码 并且能完整允许出来结果 完整的过程和数据的结果
  • ¥15 html5+css和javascript有人可以帮吗?图片要怎么插入代码里面啊
  • ¥30 Unity接入微信SDK 无法开启摄像头
  • ¥20 有偿 写代码 要用特定的软件anaconda 里的jvpyter 用python3写
  • ¥20 cad图纸,chx-3六轴码垛机器人
  • ¥15 移动摄像头专网需要解vlan
  • ¥20 access多表提取相同字段数据并合并
  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
  • ¥20 Java-Oj-桌布的计算