覆盖列表属性

本文关键字:属性 列表 覆盖 | 更新日期: 2023-09-27 18:31:32

我需要过度覆盖列表类中的属性。例如,我的类设置如下:

    public class Customer
    {
        private int _ID;
        private string _CustomerName;
        private List<CustomerAddress> _CustomerAddressList;
        public int ID { get { return _ID; } set { _ID = value; } }
        public string CustomerName
        {
            get { return _CustomerName; }
            set { _CustomerName = value; }
        }
        public List<CustomerAddress> CustomerAddressList
        {
            get { return _CustomerAddressList; }
            set { _CustomerAddressList = value; }
        }
    }
    public class CustomerAddress
    {
        private string _Address1;
        private string _TelephoneNumber;
        public string Address1
        {
            get { return _Address1; }
            set { _Address1 = value; }
        }
        public virtual string TelephoneNumber
        {
            get { return _TelephoneNumber; }
            set { _TelephoneNumber = value; }
        }
    }

现在我有了继承客户类的 Business Layer 类。

我可以覆盖客户类的属性,但我无法弄清楚如何在CustomerBL类中覆盖CustomerAddress类的属性?我不想覆盖列表设置,而是要覆盖列表中每个项目的各个属性。

覆盖列表<T>属性

根据原始设计,只有糟糕的解决方案:

    public class Customer
    {
        protected List<CustomerAddress> _customerAddresList 
           = new List<CustomerAddress>();
    }
    public class Worker : Customer
    {
    }
    public class CustomerAddress
    {
        protected string _Address1;
        public virtual string Address1
        {
            get { return "customer address: " + _Address1; }
            set { _Address1 = value; }
        }
    }
    public class WorkerAddress: CustomerAddress
    {
        public override string Address1
        {
            get { return "Worker Address: " + _Address1; }
        }
    }

如果实体实例是继承的,我们有这个:

    // Inheriting instances
    public class CustomerBL : Customer
    {
        public void AddAdress(CustomerAddress address)
        {
            _customerAddresList.Add(address);
        }
    }
    public class WorkerBL: Worker
    {
        // Not inehritable, different signature
        public void AddAdress(WorkerAddress address)
        {
            _customerAddresList.Add(address);
        }
    }

如果我们继承 BL 类,我们有这个:

    // Inheriting BL
    public class CustomerBL2 : Customer
    {
        public virtual void AddAdress(CustomerAddress address)
        {
            _customerAddresList.Add(address);
        }
    }
    public class WorkerBL2 : CustomerBL2
    {
        public override void AddAdress(CustomerAddress address)
        {
            if (!(address is WorkerAddress))
                throw new Exception();
            base.AddAdress(address);
        }
    }

如果我们使用泛型,我们有这个

    // Using generics
    public class Generic<TAddress>
    {
        private List<TAddress> _addresList
            = new List<TAddress>();
        protected virtual List<TAddress> AddresList
        {
            get { return _addresList; }
        }
    }
    public class CustomerG : Generic<CustomerAddress>
    {
    }
    public class WorkerG : Generic<WorkerAddress>
    {
    }

毫无疑问,问题在于有两种不同的继承链:

  • 实体之一
  • 另一个 BL 类
而且不可能有一个

好的决定,哪个是最重要的(事实上,我认为,通过这种设计,没有办法正确地做到这一点)。

最好让实体和 BL 类彼此独立,这样您就可以保持两个继承链的独立,并决定在其链中可以和应该继承的内容。

    public class Address
    {
    }

实体可以相互继承。好的,典型案例:

    public class Person
    {
        public List<Address> Adresses;
    }
    public class Worker: Person
    {
        // inherits adresses
    }

继承 BL 类(不喜欢它):

    public class PersonBl
    {
        // Functionality which is common fot all the inheritance chain
        public void PrintAdresses(Person person)
        {
        }
        // Functionality that can be specialized for each inherited entity
        public virtual void SaveAdresses(Person person)
        {
            // they're are treated differently in each case
        }
        // Functionality specific of person
        public void DoSomethingWithPerson(Person person)
        {
            // TODO
        }
    }
    public class WorkerBl : PersonBl
    {
        // Uses PersonBl PrintAdresses
        public override void SaveAdresses(Person person)
        {
            // do it for worker
        }
        // Functionality specific of Worker
        public void DoSomethingWithWorker(Worker worker)
        {
            // TODO
        }
    }

"使用其他 BL 类的 BL 类"(这就是我喜欢的方式):

    public class Person2Bl
    {
        // Functionality which is common for all the inheritance chain of entities
        public void PrintAdresses(Person person)
        {
        }
        public void SaveAdresses(Person person)
        {
           // specific for person
        }
        // Functionality specific of person
        public void DoSomethingWithPerson(Person person)
        {
        }
    }

    // doesn't inherit:
    public class Worker2Bl
    {
        // Use the logic in PersonBl2
        public void PrintAdresses(Worker worker)
        {
            // Really not necessary -> this could be done directly in the app code
            Person2Bl bl = new Person2Bl();
            bl.PrintAdresses(worker);
        }
        public void SaveAdresses(Worker worker)
        {
           // specific of Worker
        }
        public void DoSomethingWithWorker(Worker worker)
        {
            // specific of worker
        }
    }

事实上,最好有一个可以被WorkerBl2和PersonBl2使用的AddressBl

我认为您不应该从其他层的实体继承您的业务实体。请改用映射(手动或使用自动映射器等工具)。

即使不是很清楚你想实现什么,但考虑到你的评论:

所以我会创建另一个类公共类 Worker : 客户 { public override CustomerAddress.TeleNumber {get; set; } }正在尝试 像这样覆盖它不起作用

我会这样做:

public class Customer 
{
    protected string telNumber =string.Empty; 
    public virtual string TelephoneNumber 
    {
      get { return telNumber ; }
      set {telNumber =value;}
    }
}
public class Worker : Customer 
{
   public override string TelephoneNumber 
   {
       get 
       {
          Console.WriteLine("Worker");
          return telNumber ; 
       }
       set {telNumber = value;}
   }
}

之后,如果你在代码中使用它,就像这样:

Customer curst = new Worker(); 
var telNumber = curst.TelephoneNumber ;

它将产生如下输出:

Worker

如果这不是您要要求的,请澄清。