说我有:
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);
}
}
我想要完成的是 something()
在 Foo
上构造函数调用 something
由 Foo
定义, 不是 Bar
定义的那个.
但是如果我这样做:
Bar b = new Bar("A", "B");
Bar
构造函数调用 Foo
调用 something
的构造函数由 Bar 定义,而不是由 Foo 定义。
我知道我想做的是糟糕的面向对象设计。我这样做是为了优化。
这可能吗?谢谢。
最佳答案
在 Bar
中使用 new
关键字声明 something
方法:
new void something()
{
Console.WriteLine("Good bye, " + name2);
}
这样,Foo
类中的每个something
调用都将调用Foo.something
。而且您无法从那里调用 Bar.something
。
有了它,您可以通过将 Bar
对象转换为 Foo
来调用 Foo.something
:
((Foo)barInstance).something() // calls Foo.something()
barInstance.something() // calls Bar.something()
保持多态性的另一种方法:从 Foo
构造函数中调用不同的方法。
class Foo
{
string name1;
public Foo(string name1)
{
this.name1 = name1;
somethingImpl();
}
virtual void something()
{
somethingImpl();
}
private void somethingImpl()
{
Console.WriteLine("Hello, " + name1);
}
}
关于c# - 您如何在层次结构的某个级别而不是最低级别调用类的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20040830/