电子专业的大二狗最近在期末复习,复习到类的继承与多态性这一章,发现课本( Visual C#.NET 框架程序设计)中关于sealed修饰符的概念有点小错误,在此更正。自己坑自己也愿了,被教材坑了就真的冤大头了。
让我们翻到课本P136,从上到下第三句话“密封成员不能被派生类继承,也不能被隐藏”,既然这么说,我就试试看吧,附代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication5
{
class X //默认访问修饰符是私有的
{
protected virtual void F()
{
Console.WriteLine("X.F");
}
protected virtual void F2()
{
Console.WriteLine("X.F2");
}
}
class Y : X
{
sealed protected override void F()
{
Console.WriteLine("Y.F");
}
protected override void F2()
{
Console.WriteLine("Y.F2");
}
}
class Z:Y
{
protected new void F()
{
Console.WriteLine("隐藏基类密封成员"); //我隐藏了Y的密封成员F
}
public void display()
{
F(); //我又继承了Y的密封成员F,而且还能调用
}
}
public class Program
{
static void Main(string[] args)
{
Z z1 = new Z();
z1.display();
}
}
}
综上,“密封成员不能被派生类继承,也不能被隐藏”这句话是错的,划掉!
接下来是我对sealed这一修饰符的总结
①sealed用于类时,该类成为密封类,表示该类不能被其它类继承。
②sealed用于类中方法或属性时,表示该方法或属性不能被派生类重写。但能继承!能隐藏!能调用!