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

时间:2015-09-15 19:09:24

标签: c#

我试图在子属性设置器中设置父类属性。 我有一个主要类:用户,它有一个子类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                           
            }

        }          
    }

2 个答案:

答案 0 :(得分:1)

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

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

您肯定没有正确使用继承和组合。您正在构建一个对象树,其中对象本身具有子对象。可能在你脑海中澄清事物的东西不是将它们称为子/父类,而是在继承的情况下将它们称为子/超类,在组合的情况下将它们称为父/子对象。父对象是包含类(子对象)的另一个实例的类的实例。子类继承另一个类的成员。

答案 1 :(得分:0)

你的继承很奇怪。你的课程的确切责任对我来说并不清楚。 除此之外,您可以通过将属性设置为只读来保护属性ExpressionMembers。实现添加或删除元素的新方法。将事件(例如ExpressionMemValueChanged)添加到ExpressionMember。添加项目时会触发此事件。无论何时添加或删除元素,您都可以向此事件注册/注销ArrayPosition。在事件处理程序中,您可以设置ArrayPos值。

(您可以为ObservableCollection使用ExpressionMembers并对CollectionChanged事件作出反应,而不是写一个getter / setter。)