调用多个类的相同方法

时间:2015-06-27 12:33:49

标签: c# refactoring

我有一个类,其中多个对象的方法相同(所有对象基本上都是不同的类 - 但它们都来自同一个类):

public abstract class MyBaseClass
{
    public abstract void New();
}

public class MyRealClass
{
    public MyBaseClass Object1;
    public MyBaseClass Object2;
    public MyBaseClass Object3;

    public void MyMethod()
    {
        Object1.New();
        Object2.New();
        Object3.New();
    }
}

我想知道是否有更干净的方式,因为它看起来像一个代码味道,我称之为三次相同的方法。 Object1 - Object3的集合是有意义的。另一方面,我需要那些对象来自集合,因为我的视图(WPF)必须直接访问它们。

3 个答案:

答案 0 :(得分:1)

您可以获取MyRealClass的属性列表,这些属性是MyBaseClass的驱动类并进行强制转换,然后运行方法(New)。

答案 1 :(得分:0)

由于您正在使用对象,因此所有变量都将保存对真实对象的引用。因此,您可以在列表中包含所有三个对象,并且每个对象都有一个变量。例如,如果更新对象1的变量,并且稍后遍历列表,则会看到对象已更新。

class Program
{
    class Person
    {
        public int ID { get; set; }
        public string Name { get; set; }

        public Person(int id, string name)
        {
            this.ID = id;
            this.Name = name;
        }
    }

    static void Main(string[] args)
    {
        Person person1 = new Person(1, "name1");
        Person person2 = new Person(2, "name2");

        List<Person> items = new List<Person>();
        items.Add(person1);
        items.Add(person2);

        Console.WriteLine(string.Format("Person 1...{0}, {1}", person1.ID, person1.Name));
        Console.WriteLine(string.Format("Person 2...{0}, {1}", person2.ID, person2.Name));
        foreach (Person p in items)
            Console.WriteLine(string.Format("Person from list...{0}, {1}", p.ID, p.Name));

        person1.Name = "name1 after";
        person2.Name = "name2 after";

        Console.WriteLine(string.Format("Person 1 after...{0}, {1}", person1.ID, person1.Name));
        Console.WriteLine(string.Format("Person 2 after...{0}, {1}", person2.ID, person2.Name));
        foreach (Person p in items)
            Console.WriteLine(string.Format("Person from list after...{0}, {1}", p.ID, p.Name));

        Console.ReadKey();
    }
}

答案 2 :(得分:0)

foreach(MyBaseClass c in new MyBaseClass[] { Object1, Object2, Object3 }) 
{
    c.New();
}

如果您知道最终会拥有n个对象,则只需将对象存储在数组中。这样,您甚至可以避免每次运行循环时都创建新的数组

MyBaseClass[] MyObjects = new MyRealClass[3];

for(Int32 i = 0; i < MyObjects.Length; i++)
[
    MyObjects[i] = new MyRealClass();
}

// ... snip

foreach(MyBaseClass c in MyObjects)
{
    c.New();
}