我有这个继承模型:
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。
答案 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的实现。