Java คลาสนามธรรม
ในแนวคิดเชิงวัตถุวัตถุทั้งหมดที่อธิบายไว้โดยแบ่งตามชนิด แต่ในทางกลับกันไม่ได้ทุกชั้นถูกนำมาใช้เพื่ออธิบายวัตถุวัตถุถ้าชั้นไม่ได้มีข้อมูลเพียงพอที่จะอธิบายที่เฉพาะเจาะจง ระดับดังกล่าวเป็นระดับนามธรรม
นอกจากนี้ยังมีระดับนามธรรมไม่สามารถวัตถุ instantiated คลาสการทำงานอื่น ๆ ยังคงมีอยู่วิธีการเข้าถึงตัวแปรสมาชิกวิธีการและการก่อสร้างของสมาชิกและหมวดหมู่ทั่วไปเดียวกัน
ตั้งแต่ระดับนามธรรมไม่สามารถ instantiated วัตถุดังนั้นระดับนามธรรมต้องได้รับการสืบทอดมาก็สามารถนำมาใช้ ด้วยเหตุนี้ยังมักจะกำหนดขั้นตอนการออกแบบหรือไม่ในการออกแบบระดับนามธรรม
ระดับผู้ปกครองมีชุดของ subclass ทั่วไป แต่เนื่องจากระดับผู้ปกครองตัวเองเป็นนามธรรมคุณไม่สามารถใช้วิธีการเหล่านี้
ระดับนามธรรม
ใช้ในการกำหนดระดับนามธรรมระดับนามธรรมในภาษา Java ตัวอย่างต่อไปนี้:
/* 文件名 : Employee.java */ public abstract class Employee { private String name; private String address; private int number; public Employee(String name, String address, int number) { System.out.println("Constructing an Employee"); this.name = name; this.address = address; this.number = number; } public double computePay() { System.out.println("Inside Employee computePay"); return 0.0; } public void mailCheck() { System.out.println("Mailing a check to " + this.name + " " + this.address); } public String toString() { return name + " " + address + " " + number; } public String getName() { return name; } public String getAddress() { return address; } public void setAddress(String newAddress) { address = newAddress; } public int getNumber() { return number; } }
สังเกตว่าระดับพนักงานไม่แตกต่างกันถึงแม้ว่าระดับคือระดับนามธรรม แต่ก็ยังมีสามตัวแปรสมาชิกวิธีการและสมาชิกเจ็ดของผู้สร้าง ตอนนี้ถ้าคุณลองตัวอย่างต่อไปนี้:
/* 文件名 : AbstractDemo.java */ public class AbstractDemo { public static void main(String [] args) { /* 以下是不允许的,会引发错误 */ Employee e = new Employee("George W.", "Houston, TX", 43); System.out.println("\n Call mailCheck using Employee reference--"); e.mailCheck(); } }
เมื่อคุณพยายามที่จะรวบรวมระดับ AbstractDemo ก็จะสร้างข้อผิดพลาดต่อไปนี้:
Employee.java:46: Employee is abstract; cannot be instantiated Employee e = new Employee("George W.", "Houston, TX", 43); ^ 1 error
มรดกระดับนามธรรม
วิธีการทั่วไปของเราสืบเชื้อสายมาจากคลาส Employee:
/* 文件名 : Salary.java */ public class Salary extends Employee { private double salary; //Annual salary public Salary(String name, String address, int number, double salary) { super(name, address, number); setSalary(salary); } public void mailCheck() { System.out.println("Within mailCheck of Salary class "); System.out.println("Mailing check to " + getName() + " with salary " + salary); } public double getSalary() { return salary; } public void setSalary(double newSalary) { if(newSalary >= 0.0) { salary = newSalary; } } public double computePay() { System.out.println("Computing salary pay for " + getName()); return salary/52; } }
ในขณะที่เราไม่สามารถยกตัวอย่างวัตถุของคลาส Employee แต่ถ้าเรายกตัวอย่างวัตถุชั้นเงินเดือนที่สืบทอดจากตัวแปรระดับพนักงานและสมาชิกสามคนของสมาชิกเจ็ดของวิธีการ
/* 文件名 : AbstractDemo.java */ public class AbstractDemo { public static void main(String [] args) { Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00); Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00); System.out.println("Call mailCheck using Salary reference --"); s.mailCheck(); System.out.println("\n Call mailCheck using Employee reference--"); e.mailCheck(); } }
โปรแกรมดังกล่าวข้างต้นจะรวบรวมผลมีดังนี้
Constructing an Employee Constructing an Employee Call mailCheck using Salary reference -- Within mailCheck of Salary class Mailing check to Mohd Mohtashim with salary 3600.0 Call mailCheck using Employee reference-- Within mailCheck of Salary class Mailing check to John Adams with salary 2400.
วิธีนามธรรม
หากคุณต้องการที่จะออกแบบระดับที่มีวิธีการที่เป็นสมาชิกเฉพาะการดำเนินงานเฉพาะของวิธีการที่จะถูกกำหนดโดย subclasses ของมันแล้วคุณสามารถประกาศวิธีการในระดับผู้ปกครองเป็นวิธีนามธรรม
ในทำนองเดียวกันคำหลักนามธรรมสามารถนำมาใช้ในการประกาศวิธีนามธรรมวิธีนามธรรมมีเพียงชื่อวิธีและไม่มีร่างกายวิธีการ
วิธีนามธรรมไม่ได้ถูกกำหนดโดยตรงหลังชื่อวิธีด้วยเครื่องหมายอัฒภาคแทนวงเล็บปีกกา
public abstract class Employee { private String name; private String address; private int number; public abstract double computePay(); //其余代码 }
ประกาศวิธีนามธรรมจะส่งผลให้ทั้งสองมีผลต่อไปนี้:
- ถ้าชั้นมีวิธีการที่เป็นนามธรรมชั้นจะต้องเป็นนามธรรม
- ประเภทรองใด ๆ จะต้องแทนที่วิธีนามธรรมของระดับผู้ปกครองหรือประกาศตัวเป็นนามธรรม
ได้รับการถ่ายทอดวิธีการนามธรรม subclasses ต้องแทนที่วิธีการนี้ มิฉะนั้น subclass ต้องได้รับการประกาศให้เป็นระดับนามธรรม ในท้ายที่สุดต้องมี subclasses ที่จะใช้วิธีนามธรรมมิฉะนั้นจากเริ่มต้นสู่รอบสุดท้าย subclass ระดับผู้ปกครองไม่สามารถนำมาใช้เพื่อยกตัวอย่างวัตถุ
ถ้าชั้นเงินเดือนที่ต้องการสืบทอดคลาส Employee ก็จะต้องดำเนินการ computePay () วิธีการ:
/* 文件名 : Salary.java */ public class Salary extends Employee { private double salary; // Annual salary public double computePay() { System.out.println("Computing salary pay for " + getName()); return salary/52; } //其余代码 }