除了使用重构之外,是否可以从B类的实例调用方法A.F()。感谢..
class Program
{
public class A
{
public virtual void F()
{
Console.WriteLine( "A" );
}
}
public class B : A
{
public override void F()
{
Console.WriteLine( "B" );
}
}
static void Main( string[] args )
{
B b = new B();
//Here I need Invoke Method A.F() , but not overrode..
Console.ReadKey();
}
}
答案 0 :(得分:6)
您可能使用new
关键字来获得相同(命名)方法的另一个定义。根据引用的类型,您可以调用A
实现的B
。
public class A
{
public void F()
{
Console.WriteLine( "A" );
}
}
public class B : A
{
public new void F()
{
Console.WriteLine( "B" );
}
}
static void Main( string[] args )
{
B b = new B();
// write "B"
b.F();
// write "A"
A a = b;
a.F();
}
如果您认为new
不是正确的解决方案,您应该考虑使用专有名称编写两种方法。
通常,如果方法被正确覆盖,则无法从类外部调用基本实现。这是一个OO概念。您必须有其他方法。有四种方法(我可以想到)来指定这种区分方法:
new
关键字)它被称为隐藏。new
,但基于界面)答案 1 :(得分:3)
您需要base.F();
答案 2 :(得分:1)
您可以在派生类中使用base.method()
来调用基类中的方法。
答案 3 :(得分:1)
您只能从类定义本身中调用基本方法。因此,如果您需要这样做,那么您必须在那里完成。这可能归结为你必须重载该方法以从外部源调用基本方法(类似于@Edward Leno mentiods的方式)。
class Program
{
public class A
{
public virtual void F(bool useBase)
{
Console.WriteLine( "A" );
}
}
public class B : A
{
public override void F(bool useBase)
{
if(useBase) base.F();
else Console.WriteLine( "B" );
}
}
static void Main( string[] args )
{
B b = new B();
//Here I need Invoke Method A.F() , but not overrode..
b.F(true);
Console.ReadKey();
}
}
}
答案 4 :(得分:0)
我不确定你是否可以直接调用基本方法(可能是一个我不知道的疯狂技巧)。作为一个轻微的替代方案,您可以向B类添加方法吗?如果是这样,请添加:
public void F (int i)
{
base.F();
}
并使用以下方式调用它:
b.F(1);