6.6 类6

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的

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#教程 目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.Net学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值