需要设计模式建议

时间:2013-11-13 14:13:37

标签: c# oop design-patterns inheritance

我需要一个编程模式,但我无法弄清楚它会是什么。我甚至不确定我想要的是否可能。假设我有一个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#

3 个答案:

答案 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();