辜渝傧

13037102709

027-87870986

教学实训

您当前的位置:首页 > 教学资源 > 实训方案 >

C#应用实训|项目三 知识拓展

发布者:唯众    布时间:2020-12-12 16:24:00    点击量:

  1. 抽象类
        如果希望一个类专用于作为一个基类来派生其他类,则可以考虑把这个类定义成抽象类。抽象类不能被实例化,它是派生类的基础。通过不实现或实现部分功能,这些抽象类用于创建模板以派生其他类。定义抽象类需要使用abstract关键字,语法如下:
[访问修饰符]  abstract  class 类名
{
    代码
}
        抽象类包含零个或多个抽象方法,也可以包含零个或多个非抽象方法。定义抽象方法的目的在于指定派生类必须实现这一方法的功能(就是为方法添加代码)。抽象方法只在派生类中才真正实现,定义抽象方法使用abstract关键字而不是virtual,抽象方法只指明方法的返回值类型、方法名称及参数,而不提供方法的实现。一个类只要有一个抽象方法,该类必须定义为抽象类。
3-14】 抽象类定义。
abstract class Animal  //抽象类
{
    public string name;
    //抽象方法,无需代码实现
    public abstract void Say(string name);
    public void Eat()
    {
        Console.WriteLine("是动物都得吃东西,否则会Bye Bye .....");
    }
}
class Cat : Animal
{
    //子类重写抽象类的抽象方法
    public override void Say(string name)
    {
        Console.WriteLine("猫{0}的叫声:喵喵喵......", name);
    }
}
class Dog : Animal
{
    //子类重写抽象类的抽象方法
    public override void Say(string name)
    {
        Console.WriteLine("狗{0}的叫声:汪汪汪......", name);
    }
}
class Mouse : Animal
{
    //子类重写抽象类的抽象方法
    public override void Say(string name)
    {
        Console.WriteLine("老鼠{0}的叫声:吱吱吱......", name);
    }
}
class Program
{
    static void Main(string[] args)
    {
        // Animal an = new Animal();  //错误,抽象类不能实例化    
        Cat ct = new Cat();
        Dog dg = new Dog();
        Mouse mou = new Mouse();
        ct.Say("Tom");
        dg.Say("旺财");
        mou.Say("Jerry");
    }
}
        在上面的示例中,Animal类使用abstract关键字被定义为抽象类,而且包含了一个抽象方法——Say(),抽象方法只要方法头的定义,没有方法体。这样Cat类、Dog类和Mouse类可以自己重写抽象方法,各自去执行相应的代码。这里需要注意的是,抽象方法只能定义在抽象类中,而且抽象类不能被实例化。
   程序编译执行后输出结果如图3-13所示
图3-13  抽象类示例
       抽象类并不仅仅是一种技巧,它更代表一种抽象的概念,从而为所以的派生类确立一种“约定”。
  1. 接口
        接口是一个只说明应该做什么但不能指定如何做的“更加纯粹的抽象类”。接口定义了一种约定,实现接口的了必须遵守该约定。“开关”是用来控制电器设备通电与否的,它是接口在现实世界的一个类比,开关的作用在于打开或关闭某个设备,开关的形式也有很多种,如拉线开关、双位开关等,开关接口具有开和管两种功能,那么所以的开关都必须实现这两种功能,否则就不是开关。
        抽象类中可以有已经实现的方法,但接口中不能包含任何实现了的方法。一个类对接口的实现与派生类实现基类方法的重写一样,只是接口中的所有方法都必须在派生类中实现。接口的作用在于指明现实此特定接口的类必须实现该接口列出的所有成员,它指明了一个类必须具有哪些功能。定义接口需要使用interface关键字,语法如下:
[属性]  [修饰符]  interface  接口名
{
     //接口主体
}
在C#中定义一个接口的时候,需要注意一下几点:
  • 接口中只能声明方法、属性、索引器和事件
  • 接口不能声明字段、构造方法、常量和委托
  • 接口的成员默认是public的,如果明确指定成员的访问级别会报编译错误
  • 接口中所有的方法、属性和索引器都必须没有实现
  • C#中的接口以大写字母“1”开头。
3-15
用接口模拟实现U盘插入USB接口读写操作行为,MP3播放音乐行为。
interface IUsb
{
    void write(string message);
    string read();
}
class UPan:IUsb
{
    string message;
    public void write(string message)
    {
        this.message = message;
        Console.WriteLine("UPan write:" + message);
    }
    public string read()
    {
        return message;
    }
}
interface ISing
{
    void chang();
}
class MP3 : IUsb,ISing
{
    string message;
    public void write(string message)
    {
        this.message = message;
        Console.WriteLine("MP3 write:" + message);
    }
    public string read()
    {
        return message;
    }
 
    public void chang()
    {
        Console.WriteLine("MP3正在播放音乐:我的未来不是梦.....");
    }
}
class Program
{
    static void Main(string[] args)
    {
        UPan up = new UPan();
        up.write("Hello UPan.....");
        Console.WriteLine("UPan read:" + up.read());                  
        MP3 mp3 = new MP3();
        ISing sing = mp3 as ISing; //测试mp3是否是ISing接口类型
        if (sing != null)
        {
            sing.chang();
        }
    }
}
程序编译执行后输出结果如图3-14所示
图3-14  接口示例

项目总结

  • 不能继承父类的构造方法,子类构造方法会自动调用父类构造方法,并且父类构造方法先执行,再执行子类构造方法。使用base关键字显示调用父类构造方法。base关键字还可以访问父类成员。
  • 父类对象可以引用子类实例,并且调用子类重写的方法。
  • 接口中只定义方法的原型,接口中不能有字段和常量。
  • 多态是指二个或多个不同的类,对同一方法的不同代码实现。


上一篇:C#应用实训|任务3 银行卡账户开户实现

下一篇:C#应用实训|项目四 会员管理系统