用最簡單的一句話就是:父類型的引用指向子類型的對象。用一句比較通俗的話:同一操作作用於不同的對象,可以產生不同的效果。這就是多態。
這句話很好理解:Person person = new Student("張三");但是這個多態有什么作用呢?而我們又為什么要是有多態呢?
首先講下封裝和繼承:封裝是把過程和數據包圍起來,對數據的訪問只能通過已定義的界面,他把實現的細節影藏起來了,比如你在java中去實現一個類,這個類中提供了一些功能方法,你只需要知道你需要傳遞什么樣的參數,會達到什么樣的效果,實現細節在類中定義好了。從而使得代碼模塊化;而繼承可以擴展已存在的代碼模塊,而目的就是為了代碼重用。
那么多態除了代碼的復用,還可以解耦。然而為什么要解耦?耦合度講的是模塊模塊之間,代碼代碼之間的關聯度,通過對系統的分析把他分解成一個一個子模塊,子模塊提供穩定的接口,達到降低系統耦合度的的目的,模塊模塊之間盡量使用模塊接口訪問,而不是隨意引用其他模塊的成員變量。
多態有什么好處?
有兩個好處:
1. 應用程序不必為每一個派生類編寫功能調用,只需要對抽象基類進行處理即可。大大提高程序的可復用性。//繼承
2. 派生類的功能可以被基類的方法或引用變量所調用,這叫向后兼容,可以提高可擴充性和可維護性。 //多態的真正作用,
多態在什么地方用?
可以用在方法的參數中和方法的返回類型中。
在方法中的參數,請看下面的例子:
public abstract class Driver
{
public void run();//讓子類來運行
}
class SBenz : Driver
{
public void run()
{
Console.WriteLine("Benz在以200邁的速度在run");
}
}
class JD : Driver
{
public void run()
{
Console.WriteLine("JD is running...");
}
}
class Person
{
private Driver driver;
public Person()
{
}
public Person(Driver driver)
{
this.driver = driver;
}
public void drive()
{
driver.run();
}
public void setDriver(Driver driver)
{//運用參數多態,以后不管買什么車都可以
this.driver = driver;
}
}
static void Main(string[] args)
{
Person p = new Person();
JD jd = new JD();//剛開始沒錢就買輛JD吧
p.setDriver(jd);
p.drive();
SBenz benz = new SBenz();//有錢換車了
p.setDriver(benz);
p.drive();
}
在方法的返回類型中,請看下面的例子:
上面的例子中,不管是JD還是Benz都是我們自己直接new出來的.我們可以設計一個工廠類,專門生成汽車
/**
* 我們將多態使用在方法的返回類型中
* Driver可以是抽象類,也可以是接口,JD和Benz分別繼承該類或實現該借口
*/
public class CarFactory
{
public Driver factory(String carName)
{
if (carName.Equals("JD"))
{
return new JD();
}
else if (carName.Equals("Benz"))
{
return new SBenz();
}
else
{
Console.WriteLine("對比起,不伺候");
return null;
}
}
}
類型的參數.,傳入參數的時候,可以傳入任何一個類的對象,只要是對應的類的對象名稱就可以了
這就是多態的應用!