Day09:四驱车的壳

还记得在中坜上课时,吴老师常说:Java因介面而伟大。
初学物件导向程序概念,还真的不太能体悟为什麽,最接近的只有在JDBC吧,知道说我们的Java code可以不用改,就可以接上各厂牌的资料库管理系统,只要那家厂牌有提供JDBC的.jar档就搞定了。
现在虽然也还是挺菜的,软件工程师还当不满一年,不过在实务上就很深刻体悟到介面(interface)与多型(polymorphism)是多麽棒的概念了。
目前最常用到的地方就是在Controller的接口上了,比如整个系统中有ABCDE五种交易,虽然是不同种类的交易,但是又都有相似的地方,如果类似的验证为了要让接口能够传进资料而写了5种接口,不就相当累人,而且往後若要维护也很麻烦,可能相同的东西要改5遍; 但只要定义出这5种交易都可以装进去的一个类别,那接口就只要用这个最上层的类别利用多型接进来; 那如果接进来後我又需要进行各自交易种类的处理怎麽办? 那还可以运用特别的属性映射(reflection)射出各自的类别服务进来,真是太棒了。

接下来要谈谈一些潜规则了。

public interface Eat{
    int S = 1;
    int M = 2;
    int L = 3;
    
    void eat();
}
class Man implements Eat{
    String name;
    
    void eat(){
        System.out.println("Eat!");
    }
}

以上程序最後会印出什麽在console呢?
答案是在Man类别覆写eat()方法时就会编译错误了,因为介面所有成员都有隐藏预设的修饰子:public。
属性(field)会是public static final,方法(method)会是publci abstract。
所以当修饰子为default的Man类别实作Eat介面,并覆写eat()方法时,就不能用default修饰子来覆写eat()方法,因为继承下来的方法不能让可见范围变小,只能相等或更大。

既然提到了abstract,那也顺势来说一点吧。
abstract的用意就是为了定义一些要强制让子类别覆写的方法,可能我们还不确定方法里面实作的方式,但是又很肯定绝对需要有这个方法,那就会把它宣告为抽象(abstract); 而当一个类别中有任何一个抽象方法时,那这个类别也必须被宣告为抽象类别了!而只要类别被宣告为抽象类别,那就无法被直接创建出实例,一个牵一发动全身。

那介面和抽象类别有什麽差别? 感觉很像欸。
确实有点像,他们的特色都是先定义出一个方程序的表壳,我们会知道input及output是什麽,但里头怎麽办到是空的; 不过两者最大的差异就是抽象类别只能被继承(extends),而我们知道一个类别就只能继承一个类别,不能继承两个,但是介面的继承(应该说实作,但实际也像是在继承),就不限了,一个类别可以实作多个介面!那当可以多重实作介面後,再配上多型的概念,整个程序就有很多种面貌了。


<<:  Day 9 [Python ML、特徵工程] 分类工程

>>:  模型架构--1

VueCli $Props简单范例分享

从一张白纸开始学习前端,掐指一算也大概一年了 但对於$Props的应用,一直无法深入理解 可能碍於本...

# Day 19 Physical Memory Model (Summary)

一样先来个简单的总结吧! 这份文件 Physical Memory Model 是在描述 Linux...

[Day 27 - 小试身手] Todolist with React (2)

在上一章Todolist with React (1),建立了专案环境、并且拆离 UI 设定好所有...

[Day 26] 建立table

先到laravel专案找到环境变数档(.env) DB_CONNECTION=mysql DB_HO...

[13th][Day29] node

使用 k8s 的过程中,node , pod RC , service 等概念都可以看作是一种资源,...