我需要一个编程模式,但我无法弄清楚它会是什么。我甚至不确定我想要的是否可能。假设我有一个Class A
和10个继承自A
的类。我想要的是调用相同的方法Method Print()
在每个继承的类上实现不同,但所有这些方法都需要重复Class A
的相同方法。
Class A
{
public virtual void Print()
{
}
protected void StartingProcedure()
{
/// something
}
protected void EndingProcedure()
{
/// something
}
}
Class A_1 : A
{
public override void Print()
{
StartingProcedure();
/// class specific print operation
EndingProcedure();
}
}
Class A_2 : A
{
public override void Print()
{
StartingProcedure();
/// class specific print operation
EndingProcedure();
}
}
如您所见,我不想继续在每个被覆盖的StartingProcedure();
方法上编写Print
。我希望自动执行该过程,当我从A
继承一个新类时,我不想介意启动和结束过程,我只想编写特定于类的打印操作。是否有任何模式可以为我提供这种类行为?
BTW我使用C#
答案 0 :(得分:9)
Class A
{
public void Print()
{
StartingProcedure();
SpecificPrint();
EndingProcedure();
}
protected void StartingProcedure()
{
/// something
}
protected void EndingProcedure()
{
/// something
}
protected virtual SpecificPrint() // could possibly be abstract
{
}
}
Class A_1 : A
{
public override void SpecificPrint()
{
/// class specific print operation
}
}
Class A_2 : A
{
public override void SpecificPrint()
{
/// class specific print operation
}
}
答案 1 :(得分:3)
在这种情况下,您正在寻找的模式是Gang of Four(GoF)的模板模式。
Class A
{
public virtual void Print()
{
}
protected void StartingProcedure()
{
/// something
Print();
}
protected void EndingProcedure()
{
/// something
}
}
通常你会添加一个名为模板方法的方法:
/// Template Method
protected void Run()
{
StartingProcedure();
Print();
EndingProcedure();
}
class A_1 : A
{
public override void Print()
{
/// class specific print operation
}
public A_1()
{
base.Run();
}
}
答案 2 :(得分:1)
作为Rik答案的替代方案,如果您可以更改类层次结构,并且您真的不想在派生方法中调用基本方法,则可以使用组合而不是继承来实现此目的。通过使用装饰器模式,您可以指定包装派生函数的打印方法。
class PrintDecorator : A
{
private A wrappedA;
public PrintDecorator(A a)
{
wrappedA = a;
}
public virtual void Print()
{
//wrap the derived logic with the pre- and post- processing
StartingProcedure();
wrappedA.Print();
EndingProcedure();
}
}
class A
{
public virtual void Print()
{
}
protected void StartingProcedure()
{
/// something
}
protected void EndingProcedure()
{
/// something
}
}
class A_1 : A
{
public override void Print()
{
/// class specific print operation
}
}
class A_2 : A
{
public override void Print()
{
/// class specific print operation
}
}
使用示例:
A dec = new PrintDecorator(new A_1());
dec.Print();