版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的
6.13 密封类
出于某些原因(比如安全因素)考虑,如果希望某个类不被继承,可以设置该类为密封类,在定义类时使用sealed关键字。如:
public sealed class Cat
此时DragonLi类将不能从Cat类继承,编辑器将提示错误:
图6-24 编辑器提示无法从封闭类派生
注意:VB.Net中对应使用的是NotInheritable关键字来设置类不可被继承。
6.14 抽象类和抽象成员
抽象类是一种特殊的类,它不能被直接实例化,但可以被继承。抽象类的主要目的是为派生类提供一个通用的模板,定义一些通用的行为和属性,同时允许派生类根据具体需求实现或扩展这些行为。抽象类使用abstract关键字修饰:
public abstract class Cat
如果在代码中直接使用:
Cat mycat = new Cat();
那么编辑器会提示错误:无法创建抽象类型或接口“Cat”的实例。
但是下面的代码可以正常使用(其中DragonLi类继承自Cat类):
DragonLi mydragonli = new DragonLi();
Cat mycat = mydragonli;
抽象类下面包含非抽象成员和抽象成员:
1、非抽象成员:可以是普通的方法、属性、字段等,派生类可以直接继承和使用。
2、抽象成员:成员没有实现,必须在派生类中被覆写(实现)。抽象成员包括抽象方法、抽象属性和抽象索引器。
抽象成员通常前面加上abstract关键字修饰。例如以下抽象方法:
public abstract void introduce();
注意:抽象方法不需要加{}(花括号),而是在()(圆括号)后面直接加上;(分号)。
另外,虽然抽象类不能被实例化,但它仍然可以包含构造函数。构造函数的作用是初始化抽象类的字段,并在派生类的构造函数中被调用。而派生类必须实现抽象类中所有抽象成员。如果派生类没有实现抽象类中的所有抽象成员,派生类也必须被声明为抽象类。
【例 6.23】【项目:code6-023】抽象类的使用。
基类:
public abstract class Cat
{
//公共属性:体重
public double weight { get; set; }
//公共成员
public string catname;
//构造函数:参数为猫的名字
public Cat(string catname)
{
this.catname = catname;
Console.WriteLine("屋里新来了一只猫");
}
//构造函数,实际调用了另一个构造函数
public Cat() : this("咪咪")
{
}
public void play(string toy)
{
Console.WriteLine(catname + "正在玩" + toy);
}
public void sleep()
{
Console.WriteLine(catname + "正在睡觉");
}
//抽象方法
public abstract void introduce();
}
派生类:
public class DragonLi : Cat
{
public DragonLi() : base("布丁")
{
Console.WriteLine("屋里新来了一只狸花猫");
}
//必须实现基类的抽象方法
public override void introduce()
{
Console.WriteLine(catname + "是一只狸花猫");
}
new public void sleep()
{
base.sleep();
}
}
Program类中调用:
static void Main(string[] args)
{
DragonLi mydragonli = new DragonLi();
Cat mycat = mydragonli;
mydragonli.introduce();
mydragonli.sleep();
mycat.introduce();
mycat.sleep();
Console.ReadKey();
}
6.15 静态类
静态类是一种特殊的类,它的所有成员都是静态的(static),并且不能被实例化。静态类主要用于组织和封装与实例无关的工具方法、常量或全局功能。它们在程序中提供了一种全局访问的方式,而无需创建类的实例。
静态类使用static关键字修饰,并且具有以下特点:
1、所有成员必须是静态的,所有方法、属性、字段等都必须使用static关键字修饰;
2、静态类不能使用new关键字创建实例;
3、静态类不能定义实例构造函数,但可以定义静态构造函数,它的构造函数不能被显式调用,而是由运行时自动调用;
4、静态类不能被继承(即它是sealed的)。
【例 6.24】【项目:code6-024】静态类的使用。
静态类:
public static class CircularArea
{
// 静态字段
public static double Pi;
// 静态构造函数
static CircularArea()
{
Console.WriteLine("开始计算圆面积:");
Pi = 3.14159;
}
// 静态方法
public static double Area(double r)
{
return Pi * Math.Pow(r , 2);
}
}
Program类中调用:
static void Main(string[] args)
{
double r = 5;
// 静态构造函数会在访问静态字段或方法时自动调用
// 调用静态字段
Console.WriteLine("定义Pi的值为:"+CircularArea.Pi);
// 调用静态方法
Console.WriteLine($"半径{r}的圆面积为:" + CircularArea.Area(5));
Console.ReadKey();
}
运行结果如下图所示:
图6-25 求出圆的面积
可以看到,代码中第一次调用静态类(CircularArea)有关的成员(Pi)时,自动调用了静态类的构造函数。
学习更多vb.net知识,请参看vb.net 教程 目录
学习更多C#知识,请参看C#教程 目录