ste*_*ell 1 .net design-patterns
并感谢您的帮助
对于:
public abstract class EntityBase
{
protected void Create(EntityBase c)
{
Log.Audit(c);
}
}
public class Customer : EntityBase
{
public void CreateCustomer(Customer c)
{
Create(c);
}
}
}
public class Car : EntityBase
{
public void CreateCar(Car c)
{
Create(c);
}
}
}
Run Code Online (Sandbox Code Playgroud)
对于上面的示例1)您将如何实现方法签名:Log.Audit(c);
2)在方法Audit(c)中,我们需要将c转换为适当的类型,并遍历整个对象的属性以进行审计.如何实现这一目标.我在想......
public Audit(T t)
{
switch (t.GetType())
{
case Customer:
//Audit Customer
Audit(<Customer> t);
break;
case Car:
//Audit Car
Audit(<Car> t);
}
}
Run Code Online (Sandbox Code Playgroud)
只是一个猜测,任何帮助都会很棒.
注意:如果您能想出更好的方法来构建此方法,请告诉我们.
再次感谢.史蒂芬
在一个方法中,当你有switch或if/else构造来决定如何分派方法时,这是一个告诉你不使用多态的迹象.
一种解决方案是使Audit()成为EntityBase的虚方法,并让Audit在实例上调用它(因此您可以覆盖Customer或Car中的Audit)
您可以作为奖励提供使用反射的默认实现,该反射遍历继承类的每个属性以转储它.
public abstract class EntityBase
{
protected void Create(EntityBase c)
{
Audit(c);
}
public virtual void Audit()
{
//Default audit code here, using reflection for instance
}
}
public class Car : EntityBase
{
//Does not override, uses default Audit Code
}
public class Hamster : EntityBase
{
public override void Audit()
{
//Specific code here..
}
}
Run Code Online (Sandbox Code Playgroud)
如果您不希望在Entity类或其中一个继承者中拥有Audit责任,则必须采用反射方式.