java_PCI接口设备调用模拟(java接口和接口多态,接口类型引用变量强制转换为其implements出来的子类型)

版本一(子类没有各自独有的方法,所有方法都implements自接口)

package PCI;

/*
定义:
计算机类:
包含开机功能、关机功能,
实现计算机通过 显卡、声卡的PCI接口使用PCI设备功能,
实现播放视频和声频的方法
显卡类:要实现PCI接口,具备打开显卡、关闭显卡和播放视频的功能。
声卡类:要实现PCI接口,具备打开声卡、关闭声卡和播放音频的功能。
eg/\
interface J_Shape
{
public abstract void mb_draw(Graphics2D g);
} // 接口J_Shape结束
*/
/* default:*/
interface PCI {
    public abstract void use();

    public abstract void open();

    public abstract void close();
}

class Video implements PCI {
    public void use() {
        System.out.println("使用显卡");
    }

    public void open() {
        System.out.println("视频播放");
    }

    public void close() {
        System.out.println("关闭显卡");
    }
}

class Voice implements PCI {
    public void use() {
        System.out.println("使用声卡");
    }

    public void open() {
        System.out.println("播放音频");
    }

    public void close() {
        System.out.println("关闭声卡");
    }
}

class Computer {
    // 不写static的话静态的main()无法直接访问方法:
    public void open() {
        System.out.println("电脑开机");
    }

    public void close() {

        System.out.println("电脑关机");
    }

    /*使用PCI;这个方法需要完成的功能:输入某个PCI设备(对象参数),能够启用,播放,以及关闭着一些列完整操作
    因为插入的设备可以有多*/
    public void usePCIDevice(PCI Device) {
        Device.use();// 打开设备
        Device.open();
        Device.close();// 关闭设备

    }
}

public class Demo{
    // main()
    public static void main(String[] args) {
        Computer Pc = new Computer();
        Video video = new Video();
        Voice voice=new Voice();

        Pc.open();
        Pc.usePCIDevice(video);
        Pc.usePCIDevice(voice);



        Pc.close();
    }
}

版本二(引入判断子类结构,这样可以调用不同子类所独有的方法)(if_instanceof (subType) superTypeVariable)

package PCI;

/*
/* default:*/
interface PCI {
    public abstract void use();

    public abstract void open();

    public abstract void close();
}

class Video implements PCI {
    public void use() {
        System.out.println("使用显卡");
    }

    public void open() {
        System.out.println("视频播放");
    }

    public void close() {
        System.out.println("关闭显卡");
    }
}

class Voice implements PCI {
    public void use() {
        System.out.println("使用声卡");
    }

    public void open() {
        System.out.println("播放音频");
    }

    public void close() {
        System.out.println("关闭声卡");
    }
}

class Computer {
    // 不写static的话静态的main()无法直接访问方法:
    public void open() {
        System.out.println("电脑开机");
    }

    public void close() {

        System.out.println("电脑关机");
    }

    // 使用PCI
    public void usePCIDevice(PCI Device) {
        Device.use();// 打开设备(典型多态调用)
//调用(不同子类情况下)子类的独有方法
        if (Device instanceof Video) {
            PCI video = new Video();//由于子类中的方法接口中都有声明,无须强制类型转换;
            video.open();
        } else {
            PCI voice = new Voice();
            voice.open();
        }
        

        Device.close();// 关闭设备

    }
}

public class Demo{
    // main()
    public static void main(String[] args) {
        Computer Pc = new Computer();
        Video video = new Video();
        Voice voice=new Voice();

        Pc.open();
        Pc.usePCIDevice(video);
        Pc.usePCIDevice(voice)
        Pc.close();
    }
}

说明

由于open方法是usb接口所具有的(public static 为缺省修饰)方法.
而实现自该接口的子类也必然有这个方法
所以可以直接用父类类型的引用变量来直接进行方法调用,属于多态现象.


而为了调用两个子类中特有的方法,就需要通过if_instanceof (subType) superTypeVariable结构判断传入的父类类型的引用变量所多态引用的具体的子类对象的类型,以便调用特定子类的对应的独有方法.
posted @ 2022-06-19 00:49  xuchaoxin1375  阅读(16)  评论(0)    收藏  举报  来源