php接口的問題

 

最近學習PHP5接口的過程當中遇到了困難 ,書中說是實現多重繼承的一種方式,但我依然不知道具體該如何實現。在網上查PHP接口的資料不多,就查了java的,其實基本上都差很少。看完《澄清Java(接口與繼承)》這篇文章才恍然大悟,原來我一開始理解就有誤,所謂的多重繼承是指接口繼承類,而不是類繼承接口。
文章中提到了OO的抽象,正如文章中的那句話——"抽象就是抽去像的部分",很形象,之前想到抽象老是認爲很難理解,抽象嘛,哈哈,如今就很容易理解了,這也正是接口和抽象類所要作的事情。
文章中還有不少觀點也讓我受益不淺,羅列以下:
OO的精髓,我覺得,是對對象的抽象。
接口的做用,一言以蔽之,就是標誌類的類別(type of class)。把不一樣類型的類歸於不一樣的接口,能夠更好的管理他們。
繼承的意義也在於抽象,而不是代碼重用。
看完這篇文章,如今基本上理解接口、抽象類、繼承該如何應用了。java

原文以下:
澄清Java(接口與繼承) 計算機學院研二的兄弟與我討論Java,一見面,幾個問題全是關於接口,接口有什麼用?爲何要用接口?何時該使用接口?很慶幸他們不是問我Java如何鏈接SQL Server,或者是如何開發J2EE應用,這類問題有殺傷力,避之則吉。今年計算機學院本科有個畢業設計課題是作J2ME,選這個題目的學生在5月末都還在苦着臉研究java.util.*這個包,這個這個……唉。mysql

大多數人認爲,接口的意義在於頂替多重繼承。衆所周知Java沒有c 那樣多重繼承的機制,可是卻可以實做多個接口。其實這樣作是很牽強的,接口和繼承是徹底不一樣的東西,接口沒有能力代替多重繼承,也沒有這個義務。接口的做用,一言以蔽之,就是標誌類的類別(type of class)。把不一樣類型的類歸於不一樣的接口,能夠更好的管理他們。OO的精髓,我覺得,是對對象的抽象,最能體現這一點的就是接口。爲何咱們討論設計模式都只針對具有了抽象能力的語言(好比c 、java、c#等),就是由於設計模式所研究的,實際上就是如何合理的去抽象。(cowboy的名言是「抽象就是抽去像的部分」,看似調侃,實乃至理)。程序員

設計模式中最基礎的是工廠模式(Factory),在我最近的一個很簡單的應用中,我想盡可能的讓個人程序可以在多個數據庫間移植,固然,這涉及不少問題,單是如何兼容不一樣DBMS的SQL就讓人頭痛。咱們不妨先把問題簡單化,只考慮如何鏈接不一樣的數據庫。sql

假設我有不少個類,分別是Mysql.java、SQLServer.java、Oracle.java、DB2.java,他們分別鏈接不一樣的數據庫,統一返回一個Connection對象,而且都有一個close方法,用於關閉鏈接。只須要針對你的DBMS,選擇不一樣的類,就能夠用了,可是個人用戶他會使用什麼數據庫?我不知道,我但願的是儘可能少的修改代碼,就能知足他的須要。我能夠抽象以下接口:
package org.bromon.test;
public interface DB
{
java.sql.Connection openDB(String url,String user,String password);
void close();
}數據庫

這個接口只定義兩個方法,沒有任何有實際意義的代碼,具體的代碼由實做這個接口的類來給出,好比Mysql.java:編程

Package org.bromon.test;
import java.sql.*;
public class Mysql implements DB
{
private String url=」jdbc:mysql:localhost:3306/test」;
private String user=」root」;
private String password=」」;
private Connection conn;
public Connection openDB(url,user,password)
{
//鏈接數據庫的代碼
}c#

public void close()
{
//關閉數據庫
}
}設計模式

相似的固然還有Oracle.java等等,接口DB給這些類歸了個類,在應用程序中咱們這樣定義對象:學習

org.bromon.test.DB myDB;url

使用myDB來操做數據庫,就能夠不用管實際上我所使用的是哪一個類,這就是所謂的「開-閉」原則。可是問題在於接口是不能實例化的,myDB=new DB(),這樣的代碼是絕對錯誤的,咱們只能myDB=new Mysql()或者myDB=new Oracle()。麻煩了,我仍是須要指定具體實例化的是哪一個類,用了接口跟沒用同樣。因此咱們須要一個工廠:

package org.bromon.test;
public class DBFactory
{
public static DB Connection getConn()
{
Return(new Mysql());
}
}

因此實例化的代碼變成:myDB=DBFactory.getConn();
這就是23種模式中最基礎的普通工廠(Factory),工廠類負責具體實例化哪一個類,而其餘的程序邏輯都是針對DB這個接口進行操做,這就是「針對接口編程」。責任都被推卸給工廠類了,固然你也能夠繼續定義工廠接口,繼續把責任上拋,這就演變成抽象工廠(Abstract Factory)。

整個過程當中接口不負責任何具體操做,其餘的程序要鏈接數據庫的話,只須要構造一個DB對象就OK,而無論工廠類如何變化。這就是接口的意義----抽象。

繼承的概念不用多說,很好理解。爲何要繼承呢?由於你想重用代碼?這絕對不是理由,繼承的意義也在於抽象,而不是代碼重用。若是對象A有一個run()方法,對象B也想有這個方法,因此有人就Class B extends A。這是不經大腦的作法。若是在B中實例化一個A,調用A的Run()方法,是否是能夠達到一樣的目的?以下:
Class B
{
A a=new A();
a.run();
}

這就是利用類的聚合來重用代碼,是委派模式的雛形,是GoF一向倡導的作法。

那麼繼承的意義何在?其實這是歷史緣由形成的,最開始的OO語言只有繼承,沒有接口,因此只能以繼承來實現抽象,請必定注意,繼承的本意在於抽象,而非代碼重用(雖然繼承也有這個做用),這是不少Java爛書最嚴重的錯誤之一,它們所形成的陰影,我至今尚未徹底擺脫,壞書害人啊,尤爲是入門類的,流毒太大。何時應該使用繼承?只在抽象類中使用,其餘狀況下儘可能不使用。抽象類也是不能實例化的,它僅僅提供一個模版而已,這就很能說明問題。

軟件開發的萬惡之源,一是重複代碼而不是重用代碼,二是爛用繼承,尤以c 程序員爲甚。Java中取締多重繼承,目的就是制止爛用繼承,實是很是明智的作法,不過不少人都不理解。Java可以更好的體現設計,這是讓我入迷的緣由之一

相關文章
相關標籤/搜索