проблема варианта шаблона - PullRequest
1 голос
/ 04 июня 2011

класс разработчика 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 ]

2 голосов
/ 04 июня 2011

Вы не можете.Нет, если вы не измените базовый класс.

Ну, я полагаю, вы могли бы сделать

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

Но я думаю, что вы не это имеете в виду.И это не решает общий случай этой проблемы (например, если вместо int будет string).

1 голос
/ 04 июня 2011

Помимо очевидного (делая возвращаемое значение + 100 вместо 100), я не вижу другого механизма, который не требует изменения базового класса.

1 голос
/ 04 июня 2011

если вы можете изменить noImplementerKnowsThatValue в базовом классе на защищенный, вы можете сделать

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

Я не думаю, что есть способ сделать это без изменения базового класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...