繁体   English   中英

c#在子设置器中设置父类属性

[英]c# Set Parent class property in child setter

我试图在子属性设置器中设置父类属性。 我有一个主要类: User ,它具有子类LIST ArrayPositions ,而子类又具有ExpressionMember的子类列表。 每当在ExpressionMember类中设置属性ExpressionMemValue时,我也要更新其父类ArrayPosition。 但是,当前解决方案不会更新相应的父项。 这是代码:

   public List<User> users = new List<User>();
    public class User 
    {
        public string ImageName { get; set; }
        private string _PartName = "";
        public string PartName
        {
            get
            {
                return this._PartName; 
            }
            set { 
                _PartName=value; 
            }
        }
        public List <ArrayPosition> ArrayPositions { get; set; }
        public override string ToString()
        {
            return this.PartName.ToString();
        }
    }
    public class ArrayPosition:User 
    {
        public string myArrayPos = "";
        public string PartId { get; set; }
        public string ArrayPos
        {
            get
            {              
                return this.myArrayPos;                 
            }
            set
            {
                this.myArrayPos = value;
            }

        }
        public List<ExpressionMember> ExpressionMembers { get; set; }
    }        
    public class ExpressionMember : ArrayPosition
    {
        public string ExpressionMem { get; set; }
        public string MyExpressionMemValye="";            
        public string ExpressionMemValue
        {
            get
            {
                return MyExpressionMemValye;                
            }
            set
            {                   
                MyExpressionMemValye = value;
               // this.ArrayPos = value;  //set parent value, this will not update it                           
            }

        }          
    }

看起来您不需要使用继承,而是使用您已经在做的组合。 尝试这样做。 无论如何,这都不是完美的,但是我正在努力不改变您的总体策略。

public class User 
{
    public string ImageName { get; set; }
    private string _PartName = "";
    public string PartName
    {
        get
        {
            return this._PartName; 
        }
        set { 
            _PartName=value; 
        }
    }
    public List <ArrayPosition> ArrayPositions { get; set; }
    public override string ToString()
    {
        return this.PartName.ToString();
    }
}
public class ArrayPosition 
{
    public string myArrayPos = "";
    public string PartId { get; set; }
    public string ArrayPos
    {
        get
        {              
            return this.myArrayPos;                 
        }
        set
        {
            this.myArrayPos = value;
        }

    }

    public List<ExpressionMember> ExpressionMembers { get; set; }
}        
public class ExpressionMember
{
    private ArrayPosition _parentArrayPosition;
    public string ExpressionMem { get; set; }
    public string MyExpressionMemValye="";            
    public string ExpressionMemValue
    {
        get
        {
            return MyExpressionMemValye;                
        }
        set
        {                   
            MyExpressionMemValye = value;
            this._parentArrayPosition.ArrayPos = value;
        }

        public ExpressionMember(ArrayPosition parent) {
            _parentArrayPosition = parent;
        }
    }          
}

您肯定没有正确使用继承和组合。 您正在寻找建立一棵对象树,其中对象本身具有子对象。 有些事情可能会澄清您的想法,而不是将它们称为子类/父类,在继承的情况下将它们称为子/父类,在组合的情况下将它们称为父/子对象。 父对象是一个类的实例,其中包含一个类的另一个实例(子对象)。 子类继承另一个类的成员。

您的继承权很奇怪。 我不清楚您的课程的确切职责。 除此之外,您可以通过将属性ExpressionMembers为只读来保护它。 实现一个新方法来添加或删除元素。 将一个事件(例如ExpressionMemValueChanged )添加到ExpressionMember 添加项目时触发此事件。 每当添加或删除元素时,都将ArrayPosition注册/注销此事件。 然后,您可以在事件处理程序内部设置ArrayPos值。

(您可以为您的ExpressionMembers使用ObservableCollection ,并对CollectionChanged事件做出反应,而不用编写getter / setter。)

暂无
暂无

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

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