还记得在中坜上课时,吴老师常说: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、特徵工程] 分类工程
从一张白纸开始学习前端,掐指一算也大概一年了 但对於$Props的应用,一直无法深入理解 可能碍於本...
一样先来个简单的总结吧! 这份文件 Physical Memory Model 是在描述 Linux...
在上一章Todolist with React (1),建立了专案环境、并且拆离 UI 设定好所有...
先到laravel专案找到环境变数档(.env) DB_CONNECTION=mysql DB_HO...
使用 k8s 的过程中,node , pod RC , service 等概念都可以看作是一种资源,...