代码之家  ›  专栏  ›  技术社区  ›  Jim G.

如何将适配器模式应用于集合?

  •  2
  • Jim G.  · 技术社区  · 14 年前

    考虑到下面的两个课程,我怎么能 转换 List<Person> List<Person2> ?

    编辑: 这是一个捏造的例子。我想说的是我不能修改 Person 上课,我们会知道的 arbitraryNumber 当我们实例化 列出<个人2> .

    编辑2: 我知道你们中的许多人会觉得这难以置信,但这段代码将被部署到Windows-Server-2000机器上,这意味着它必须与.NET 2.0一起工作。[是-我觉得这也难以置信。]

    public class Person
    {
        private string _lastName;
        public string LastName
        {
            get { return _lastName; }
            set { _lastName = value; }
        }
    
        private string _firstName;
        public string FirstName
        {
            get { return _firstName; }
            set { _firstName = value; }
        }
    }
    
    public class Person2 : Person
    {
        private readonly int _arbitraryNumber;
        public Person2(int arbitraryNumber)
        {
            _arbitraryNumber = arbitraryNumber;
        }
    
        public string FullName
        {
            get
            {
                return String.Format("{0}, {1} - {2}", LastName, FirstName, _arbitraryNumber);
            }
        }
    }
    
    1 回复  |  直到 14 年前
        1
  •  3
  •   Mike Two    14 年前

    我认为Person2需要改变成一个适配器。像这样的东西

    public class Person2
    {
        private readonly int _arbitraryNumber;
        private readonly Person _person;
        public Person2(Person person, int arbitraryNumber)
        {
            _arbitraryNumber = arbitraryNumber;
            _person = person;
        }
    
        public string FullName
        {
            get
            {
                return String.Format("{0}, {1} - {2}", _person.LastName, _person.FirstName, _arbitraryNumber);
            }
        }
    }
    

    那么集合上的适配器就更容易了。

    List<Person> persons = new List<Person>();
    // put some people in it.
    var person2s = persons.Select(p => new Person2(4, p)); // 4 chosen arbitrarily
    

    或.NET 2

    List<Person2> person2s = new List<Person2>();
    foreach (Person p in persons)
    {
        Person2 person2 = new Person2(p, 11); // 11 arbitrarily chosen by asking a kid for a number
        person2s.Add(person2);
    }