如何在派生类中干燥静态重复样板代码?

时间:2019-03-10 07:16:42

标签: c# oop dry object-oriented-analysis

我有这个继承模型:

public class Animal
{
}

public class Dog : Animal
{
    public static List<Action<Dog>> Augmenters = new List<Action<Dog>>();
}

public class Cat : Animal
{
    public static List<Action<Cat>> Augmenters = new List<Action<Cat>>();
}

// in another place of the code, augmenters are added and configured
public static void Main (string[] args) 
{
    Dog.Augmenters.Add(dog => 
    {
         // doing something with dog
    });        
    Cat.Augmenters.Add(cat => 
    {
         // doing something with cat
    });
}

在每个Dog / Cat / etc中,增强器都有很多静态代码。在所有派生类中完全相同的类,包括空检查,实例化,并发控制,性能调整等。

狗增强器应该是静态的,因为它们适用于所有狗,而不仅仅是一只狗。猫咪增强器等也是如此。

但是它们不能迁移到Animal类,因为每个派生类的扩充器都与其他类不同。如果我将Augmenters移到Animal类,那么每个只属于猫的增强器也将应用于狗。

您如何干燥这种样板代码?

我在这里看到了something similar for C++,叫做CRTP

1 个答案:

答案 0 :(得分:3)

让我试着干

class Program
{

    public abstract class Animal<T> where T : Animal<T>
    {
        public static List<Action<T>> Augmenters = new List<Action<T>>();
    }

    public class Dog : Animal<Dog>
    {

    }

    public class Cat : Animal<Cat>
    {

    }

    // in another place of the code, augmenters are added and configured
    public static void Main(string[] args)
    {
        Dog.Augmenters.Add(dog =>
        {
            Console.WriteLine("bark");
        });

        Cat.Augmenters.Add(cat =>
        {
            Console.WriteLine("meow");
        });

        Dog.Augmenters[0].Invoke(new Dog());
        Cat.Augmenters[0].Invoke(new Cat());
        Console.ReadLine();
    }
}

添加了抽象方法并为其类型添加了约束,至少您不必在具体类中重复执行Augementers的实现。