面向对象的特征——多态

什么时候该用继承?有一个简单规则可以用来判断是否应该将数据设计为继承关系,这就是“is_a”规则。它指出子类的对象也是超类的对象。“is_a”规则的另一种表述是替换原则。它指出程序中出现超类对象的任何地方都可以使用子类对象替换。

一个对象变量可以声明为多种对象类型的现象称为多态。在运行时能够自动地选择适当的方法,称为动态绑定。
下面通过代码来展示多态与动态绑定:


public class Employee
{
    private String name = "";
    private int    age  = 0;
    private double salary = 0.0;

  ……

    public double getSalary() {
        return salary;
    }

 ……
}

public class Manager extends Employee {
    private double bonus = 0.0;

   ……

    @Override
    public double getSalary() {
        return super.getSalary() + bonus;
    }
}

//  多态
Employee manager = new Manager("James", 36, 4000, 100);
// 动态绑定
 System.out.println(manager.getSalary());  // 4100.0

如果没有多态性,那么抽象类以及接口就没有意义了。所以,多态是面向对象中及其重要的特性。但多态不是那么容易理解的。下面,写一个使用了多态性的案例。

首先,定义一个抽象类APay,该类有一个抽象方法pay,该方法是用来支付的。因为支付方式可能有多种,比如网银、支付宝、微信等。用户可以选择不同的付款方式

abstract class APay
{
    abstract boolean pay ();
}

目前有网银、支付宝、微信三种支付方法:

class NetBankPay extends APay
{
    public boolean pay (double money)
    {
        System.out.println("使用网银支付" + money);
        return true;
    }
}

class AliPay extends APay
{
    public boolean pay (double money)
    {
        System.out.println("使用支付宝支付" + money);
        return true;
    }
}

class WxPay extends APay
{
    public boolean pay (double money)
    {
        System.out.println("使用微信支付" + money);
        return true;
    }
}

接下来展示多态的用法

public class T1
{
    public static void main (String [] args)
    {
        // ...
        pay(new AliPay(), 2888);
    }

    public static boolean pay (APay payType, double money)
    {

        return payType.pay(money);
    }
}