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