模板模式变体问题

时间:2011-06-03 20:26:18

标签: c# design-patterns

实现者类'thefoo'从其构造函数中获取一个整数。但是基类'foo'看不到它的构造函数值'input'。因为基地ctor首先工作。我需要某种方式告诉基础实施者的ctor值。如果不改变基数,我可以通过以下的失败测试吗?

public abstract class foo
    {
        int noImplementerKnowsThatValue = 0;
        protected abstract int intro();
        protected abstract int outtro();

        public foo()
        {
            noImplementerKnowsThatValue += intro ();
        }

        public int compose ()
        {
            return noImplementerKnowsThatValue + outtro ();
        }
    }
    public class theFoo : foo
    {
        int value;

        public theFoo (int input)
        {
            value = input;
        }

        protected override int intro ()
        {
            return value;
        }

        protected override int outtro ()
        {
            return 100;
        }
    }

    public class fooTest
    {
        public void failingTest ()
        {
            var foo = new theFoo (100);
            int x = foo.compose ();
            Debug.Assert (200 == x);
        }
    }

3 个答案:

答案 0 :(得分:2)

你做不到。除非您更改基类,否则不会。

好吧,我想你可以做

protected override int intro ()
{
    return 0;
}
protected override int outtro ()
{
    return 100 + value;
}

但我认为这不是你的意思。它并没有解决这个问题的一般情况(例如,如果不是int,那么就会有string)。

答案 1 :(得分:1)

如果您可以将基类中的noImplementerKnowsThatValue更改为受保护,则可以执行

public theFoo (int input)
{
    base.noImplementerKnowsThatValue = input;
    value = input;
}

我认为没有办法在不改变基类的情况下做到这一点。

答案 2 :(得分:1)

除了显而易见的(使outtro返回值+ 100,而不是100),我看不到任何其他不需要更改基类的机制。