【发布时间】:2013-12-01 04:37:21
【问题描述】:
说我有:
class Foo
{
string name1;
public Foo(string name1)
{
this.name1 = name1;
something();
}
virtual void something()
{
Console.WriteLine("Hello, " + name1);
}
}
class Bar inherits Foo
{
public Bar(string name1, string name2) : base(name1)
{
this.name2 = name2;
something();
}
override void something()
{
Console.WriteLine("Good bye, " + name2);
}
}
我想要完成的是Foo 构造函数上的something() 调用Foo 定义的something,而不是Bar 定义的那个。
但如果我这样做:
Bar b = new Bar("A", "B");
Bar 构造函数调用 Foo 构造函数,该构造函数调用由 Bar 而非 Foo 定义的 something。
我知道我想做的是一个糟糕的面向对象设计。我这样做是为了优化。
有可能吗?谢谢。
【问题讨论】:
-
你可以尝试重载而不是覆盖
-
您缺少 virtual 关键字。
-
这会导致糟糕的 OOP 设计。如果您打算在基础对象上调用某些东西 - 让它显而易见。您不想在基类和子类之间混合实现。正如另一个发布的那样 - base.Something() 是确保从正确位置调用它的最佳方法。
-
“我这样做是为了优化。”什么样的优化?你能给我们解释一下吗?也许有更好的解决方案。
-
@svick,当然。我正在为我正在学习的课程做一个编译器。通过“优化”,我指的是对解析树进行尽可能少的传递。 “某事”实际上代表我在解析的同时尝试执行的传递,因此,我在构造的构造函数中调用了某些东西。我相信一个好的 OOP 设计会建议不要在初始化时调用不需要初始化的方法。
标签: c# inheritance methods hierarchy