📅  最后修改于: 2023-12-03 15:42:25.100000             🧑  作者: Mango
在面向对象编程中,类与类之间经常会有继承关系。子类会继承父类中的一些属性和方法,但是有时候子类并不需要全部继承,而是只需要重写一部分方法。在这种情况下,可以使用方法隐藏的技术,使子类中的方法屏蔽掉父类中同名的方法。本文将介绍如何使用方法隐藏来隐藏基类中所有具有相同名称的重载方法。
方法隐藏是指在子类中定义一个与父类同名且参数类型、个数也相同的方法,使之屏蔽掉父类中同名的方法。这样,在对子类对象进行调用时,实际上是调用了子类中定义的方法,而不是父类中的方法。方法隐藏是一种多态的实现方式,可以提高代码的复用性和灵活性。
在继承关系中,父类中可能会定义多个同名的方法,它们的参数列表不同,称为方法的重载。如果子类只需要覆盖其中的一个方法,而其他方法则直接继承自父类,可以使用方法隐藏来实现。具体方法如下:
在子类中定义一个同名方法,与基类中待隐藏的方法(或方法集合)参数列表相同。
在子类中使用 new
关键字来声明该方法,显示地表明这是一个新方法,而不是基类中的同名方法。
下面是一个示例代码:
public class MyBaseClass
{
public void DoSomething()
{
Console.WriteLine("MyBaseClass.DoSomething()");
}
public void DoSomething(int i)
{
Console.WriteLine("MyBaseClass.DoSomething(int i)");
}
public virtual void DoSomethingElse()
{
Console.WriteLine("MyBaseClass.DoSomethingElse()");
}
}
public class MyDerivedClass : MyBaseClass
{
public new void DoSomething()
{
Console.WriteLine("MyDerivedClass.DoSomething()");
}
public override void DoSomethingElse()
{
Console.WriteLine("MyDerivedClass.DoSomethingElse()");
}
}
class Program
{
static void Main(string[] args)
{
MyBaseClass baseObj = new MyBaseClass();
baseObj.DoSomething();
baseObj.DoSomething(1);
baseObj.DoSomethingElse();
MyDerivedClass derivedObj = new MyDerivedClass();
derivedObj.DoSomething();
derivedObj.DoSomething(1);
derivedObj.DoSomethingElse();
MyBaseClass derivedBaseObj = new MyDerivedClass();
derivedBaseObj.DoSomething();
derivedBaseObj.DoSomething(1);
derivedBaseObj.DoSomethingElse();
}
}
在上述代码中,基类 MyBaseClass
定义了三个方法,它们都有相同的方法名 DoSomething
。子类 MyDerivedClass
隐藏了其中的 DoSomething
方法,在该方法前使用 new
关键字声明。调用 MyBaseClass
对象和 MyDerivedClass
对象的 DoSomething
和 DoSomethingElse
方法,分别输出不同的结果。请注意,调用 MyDerivedClass
对象通过 MyBaseClass
引用的 DoSomething
方法实际上调用的是被隐藏的 MyDerivedClass.DoSomething
方法。
方法隐藏是一种多态的实现方式,它可以在子类中屏蔽掉父类同名的方法,提高程序的灵活性和可复用性。但是,过度使用方法隐藏可能会导致代码可读性降低,应该慎重使用。另外,在调用被隐藏的方法时,要注意使用哪一个引用类型,以避免出现错误。