4

我需要一个编程模式,但我不知道它会是什么。我什至不确定我想要的是否可能。可以说我有一个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不想介意开始和结束过程中继承一个新类时,我只想编写特定于类的打印操作。是否有任何模式可以为我提供这种类行为?

顺便说一句,我使用 C#

4

3 回答 3

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
    }
}
于 2013-11-13T14:19:37.667 回答
3

在这种情况下,您正在寻找的模式是四人帮 (GoF)的模板模式。

Class A
{
    public virtual void Print()
    { 
    }
    protected void StartingProcedure()
    {
        /// something 
        Print();
    }
    protected void EndingProcedure()
    {
        /// something 
    }
}

通常你会添加另一个名为Template Method的方法:

/// 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();
    }
}
于 2013-11-13T14:18:40.727 回答
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();
于 2013-11-13T14:25:29.520 回答