C#面向对象 - 子类隐藏父类的方法

当子类与父类拥有完全一样的方法时,称子类“隐藏”了父类的同名方法。

如果子类中某个方法与父类方法完全一样(即方法名和方法参数都一样),假设父类变量引用一个子类对象,那么通过父类变量访问此方法,访问到的是子类还是父类所定义到的方法?

 

Public class Parent{

    Public void HideF(){

        Console.WriteLine(“Parent.HideF()”);

    }

}

 

Public class Child:Parent{

    Public void HideF(){

        Console.WriteLine(“Child.HideF()”);

    }

}

 

// 输出

Parent par = new Child();

par.HideF(); // Parent.HideF()

 

当分别位于父类和子类的两个方法完全一样时,调用哪个方法由对象变量的编译时类型决定。

 

如果确实希望调用的是子类的方法,应先进行强制类型转换

((Child)par).HideF();

 

回过头来再看看parent和Child类,vs在编译这两个类是会发出一个警告:

警告1: “HideExamples.Child.HideF()” 隐藏了继承的成员

            “HideExamples.Child.HideF()”如果是有意隐藏,请使用关键字new

 

当然上述警告并不影响程序运行结果,却告诉我们代码不符合C#的语法规范,修改Child类的代码以消除上述警告:

Public class Child:Parent{

    Public new void HideF(){

        Console.WriteLine(“Child.HideF()”);

    }

}

New关键字明确告诉C#编辑器:子类会隐藏父类的同名方法,并提供自己的新版本。

由于子类隐藏了父类的同名方法,所以如果要在子类方法的实现代码中调用父类被隐藏的同名方法,请使用base关键字,示例代码如下:

Public class Child:Parent{

    Public new void HideF(){

        Console.WriteLine(“Child.HideF()”);

        base.HideF(); // 调用父类被隐藏的方法

    }

}

 

 

你可能感兴趣的:(C#)