第十三章 接口和抽象类

1.接口
接口体现的是扩展功能,本身不含数据和功能实现。

interface IUsb
{
    //a: 接口中不含任何数据, 如字段。
    
    void SetData(int data); //b: 声明方法不指定任何访问修饰符(public, private和protected都不行)。接口所有方法都隐式为公共方法。
    int GetData(); //c: 接口中永远不含任何实现。
}

interface IBluetooth
{
    void SetData(int data);
    int GetData();
    bool TestConnection();
}

// 类实现多个接口,为了区分,可在方法名称前加上接口名限定,这种方式称为显式实现接口。
class Mouse : IUsb, IBluetooth
{
    private int storedData;
    private bool connectionStatus;

    void IUsb.SetData(int data)
    {
        this.storedData = data;
    }

    int IUsb.GetData()
    {
        return this.storedData;
    }

    public void SetData(int data)
    {
        this.storedData = data;
    }

    public int GetData()
    {
        return this.storedData;
    }

    public bool TestConnection()
    {
        int receivedData = 0;

        SetData(this.storedData);
        receivedData = GetData();

        if (receivedData == this.storedData)
        {
            this.connectionStatus = true;
        }
        else
        {
            this.connectionStatus = false;
        }

        return this.connectionStatus;
    }
}

public static void Main(string [] args)
{
    Mouse mouse = new Mouse();

    IUsb usb = mouse;
    //mouse.SetData(12); // 编译时错误
    usb.SetData(12);
    Console.WriteLine($"storedData: {usb.GetData()}");

    IBluetooth bluetooth = mouse;
    mouse.SetData(24);
    bluetooth.SetData(24);
    bool connectionStatus = bluetooth.TestConnection();
    Console.WriteLine($"storedData: {bluetooth.GetData()}, connectionStatus: {connectionStatus}");
    
    // 输出:
    //      storedData: 12
    //      storedData: 24, connectionStatus: True
}

a, 显示实现接口,还有一个容易被忽略的变化,不能为方法指定访问修饰符。
b, void IUsb.SetData() 无访问修饰符,为私有。mouse对象无法访问,但却可以用恰当的接口引用Mouse对象。


2.抽象类
在继承中,将各个子类中通用的功能提取到一个单独的类中,这个类是通用功能的抽象,不是单独存在的实体。

interface IUsb
{
    void SetData(int data);
    int GetData();
}

interface IBluetooth
{
    void SetData(int data);
    int GetData();
    bool TestConnection();
}

abstract class DataProcess
{
    private int storedData;
    private bool connectionStatus;
    public void SetData(int data)
    {
        this.storedData = data;
    }

    public int GetData()
    {
        return this.storedData;
    }

    public bool TestConnection()
    {
        int receivedData = 0;

        SetData(this.storedData);
        receivedData = GetData();

        if (receivedData == this.storedData)
        {
            this.connectionStatus = true;
        }
        else
        {
            this.connectionStatus = false;
        }

        return this.connectionStatus;
    }
}

class Mouse : DataProcess, IUsb, IBluetooth
{
    
}

class Keyboard : DataProcess, IUsb, IBluetooth
{

}

public static void Main(string [] args)
{
    Mouse mouse = new Mouse();
    IBluetooth bluetooth = mouse;
    mouse.SetData(24);
    bluetooth.SetData(24);
    bool connectionStatus = bluetooth.TestConnection();
    Console.WriteLine($"storedData: {bluetooth.GetData()}, connectionStatus: {connectionStatus}");

    Keyboard keyboard = new Keyboard();
    IBluetooth bluetoothKeyboard = keyboard;
    bluetoothKeyboard.SetData(48);
    bool connectionStatusKeyboard = bluetoothKeyboard.TestConnection();
    Console.WriteLine($"storedData: {bluetoothKeyboard.GetData()}, connectionStatus: {connectionStatusKeyboard}");

    // 输出:
    //      storedData: 24, connectionStatus: True
    //      storedData: 48, connectionStatus: True
}

Keyboard, Mouse类中存在相同的功能实现GetData(), SetData(), TestConnection()等。为避免重复,将各个类中相同的方法实现放到专门的一个类中。相当于在各个类中提取出一个父类,因此在子类中可以删除大量重复性代码。


3.密封类
声明为密封的类为最终类,不可以被继承。密封类用sealed关键字修饰。

sealed class Lamp
{
    public sealed override light() // 密封方法。只有用overide关键字声明的方法才能密封。
    {
        .....
    }
}

 // 修饰方法的几个关键字区别
 // 1.virtual, 虚方法,方法的第一个实现。
 // 2.override, 重写方法, 方法的另一个实现。
 // 3.sealed override, 密封方法, 方法的最后一个实现。
posted @ 2021-02-21 08:57  葡式蛋挞  阅读(9)  评论(0)    收藏  举报