Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 模板模式变体问题_C#_Design Patterns - Fatal编程技术网

C# 模板模式变体问题

C# 模板模式变体问题,c#,design-patterns,C#,Design Patterns,实现者类“thefoo”从其构造函数中获取一个整数。但基类“foo”无法看到其构造函数值“input”。因为基本构造函数首先工作。我需要某种方法来告诉基础实现者的ctor值。在不改变基准的情况下,我可以通过以下失败测试吗 public abstract class foo { int noImplementerKnowsThatValue = 0; protected abstract int intro(); protected abst

实现者类“thefoo”从其构造函数中获取一个整数。但基类“foo”无法看到其构造函数值“input”。因为基本构造函数首先工作。我需要某种方法来告诉基础实现者的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);
        }
    }

如果可以将基类中的
noImplementerKnowsThatValue
更改为protected,则可以执行以下操作

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

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

如果您可以将基类中的
noimplementerknowsthattvalue
更改为protected,那么您可以这样做

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

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

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

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

您不能。除非更改基类,否则不会

好吧,我想你可以

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

但我想你不是这个意思。它不能解决这个问题的一般情况(例如,如果不是
int
,而是
string
)。

你不能。除非更改基类,否则不会

好吧,我想你可以

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

但我想你不是这个意思。它不能解决这个问题的一般情况(例如,如果不是
int
,而是
string
)。

为什么在这两个类中都定义了“value”成员?它只在基类中是必需的。请确保它被定义为受保护的成员。我认为基类不清楚。我又编辑了。这个断言不是已经通过了吗?还是我遗漏了什么?不,这就是问题所在。构造函数的执行顺序。foo覆盖了foo的行为。相反的是可以接受的,但是这个很奇怪,为什么在这两个类中都定义了“value”成员?它只在基类中是必需的。请确保它被定义为受保护的成员。我认为基类不清楚。我又编辑了。这个断言不是已经通过了吗?还是我遗漏了什么?不,这就是问题所在。构造函数的执行顺序。foo覆盖了foo的行为。相反的情况是可以接受的,但是这个很奇怪,或者如果我在'theFoo'类Baz{public int value=100;}public类theFoo:foo{int value;public theFoo(Baz input){value=input.value;}中使用引用的类,则会因为相同的原因引发NullExceptionproblem@jacklondon-没错。这就是为什么强烈反对在构造函数中调用虚函数的原因。或者如果我在'theFoo'类Baz{public int value=100;}公共类theFoo:foo{int value;public theFoo(Baz input){value=input.value;}中使用引用的类由于相同的原因引发NullExceptionproblem@jacklondon-没错。这就是为什么不鼓励在构造函数中调用虚拟函数的原因。