มรดก
พิจารณารถยนต์และรถบัส พวกเขาเป็นยานพาหนะสองแบบที่แตกต่างกัน แต่ถึงกระนั้นพวกเขาแบ่งปันคุณสมบัติทั่วไปบางอย่างเช่นพวกเขามีพวงมาลัย, เบรก, เกียร์, เครื่องยนต์ ฯลฯ
ดังนั้นด้วยแนวคิดการสืบทอดสิ่งนี้สามารถแสดงได้ดังต่อไปนี้ ...
public class Vehicle {
private Driver driver;
private Seat[] seatArray; //In java and most of the Object Oriented Programming(OOP) languages, square brackets are used to denote arrays(Collections).
//You can define as many properties as you want here ...
}
ตอนนี้จักรยาน ...
public class Bicycle extends Vehicle {
//You define properties which are unique to bicycles here ...
private Pedal pedal;
}
และรถยนต์ ...
public class Car extends Vehicle {
private Engine engine;
private Door[] doors;
}
นั่นคือทั้งหมดที่เกี่ยวกับมรดก เราใช้พวกมันเพื่อจัดประเภทวัตถุเป็นรูปแบบฐานที่ง่ายขึ้นและลูก ๆ ของพวกเขาตามที่เราเห็นด้านบน
คลาสนามธรรม
คลาสนามธรรมเป็นวัตถุที่ไม่สมบูรณ์ เพื่อทำความเข้าใจเพิ่มเติมให้ลองพิจารณาความคล้ายคลึงของยานพาหนะอีกครั้ง
ยานพาหนะสามารถขับเคลื่อนได้ ขวา? แต่ยานพาหนะที่แตกต่างกันได้รับการขับเคลื่อนด้วยวิธีที่ต่างกัน ... ตัวอย่างเช่นคุณไม่สามารถขับรถได้ในขณะที่คุณขับรถจักรยาน
ดังนั้นวิธีการแสดงฟังก์ชั่นการขับขี่ของยานพาหนะ? มันยากที่จะตรวจสอบประเภทของยานพาหนะและขับด้วยฟังก์ชั่นของตัวเอง คุณจะต้องเปลี่ยนคลาส Driver อีกครั้งและอีกครั้งเมื่อเพิ่มยานพาหนะประเภทใหม่
นี่คือบทบาทของคลาสและวิธีการที่เป็นนามธรรม คุณสามารถกำหนดวิธีการไดรฟ์เป็นนามธรรมเพื่อบอกว่าลูกที่สืบทอดมาทุกคนจะต้องใช้ฟังก์ชั่นนี้
ดังนั้นหากคุณปรับเปลี่ยนคลาสรถ ...
//......Code of Vehicle Class
abstract public void drive();
//.....Code continues
จักรยานและรถยนต์จะต้องระบุวิธีการขับขี่ด้วย มิฉะนั้นรหัสจะไม่รวบรวมและเกิดข้อผิดพลาด
ในระยะสั้น .. ชั้นนามธรรมเป็นชั้นที่ไม่สมบูรณ์บางส่วนกับฟังก์ชั่นที่ไม่สมบูรณ์บางอย่างซึ่งเด็กที่สืบทอดจะต้องระบุของตัวเอง
การเชื่อมต่อการเชื่อม
ต่อจะไม่สมบูรณ์โดยสิ้นเชิง พวกเขาไม่มีคุณสมบัติใด ๆ พวกเขาเพียงระบุว่าเด็กที่สืบทอดมานั้นสามารถทำอะไรบางอย่าง ...
สมมติว่าคุณมีโทรศัพท์มือถือประเภทต่าง ๆ อยู่กับคุณ แต่ละคนมีวิธีที่แตกต่างกันในการทำหน้าที่ที่แตกต่างกัน เช่นเรียกบุคคล ผู้ผลิตโทรศัพท์ระบุวิธีการทำ ที่นี่โทรศัพท์มือถือสามารถหมุนหมายเลข - นั่นคือมันสามารถหมุนได้ ลองแทนค่านี้เป็นอินเทอร์เฟซ
public interface Dialable {
public void dial(Number n);
}
ที่นี่ผู้สร้าง Dialable กำหนดวิธีการโทรออกด้วยหมายเลข คุณเพียงแค่ต้องให้หมายเลขเพื่อโทร
// Makers define how exactly dialable work inside.
Dialable PHONE1 = new Dialable() {
public void dial(Number n) {
//Do the phone1's own way to dial a number
}
}
Dialable PHONE2 = new Dialable() {
public void dial(Number n) {
//Do the phone2's own way to dial a number
}
}
//Suppose there is a function written by someone else, which expects a Dialable
......
public static void main(String[] args) {
Dialable myDialable = SomeLibrary.PHONE1;
SomeOtherLibrary.doSomethingUsingADialable(myDialable);
}
.....
ต่อไปนี้จะใช้อินเทอร์เฟซแทนคลาสนามธรรมผู้เขียนฟังก์ชันที่ใช้ Dialable ไม่จำเป็นต้องกังวลเกี่ยวกับคุณสมบัติของมัน เช่นมีหน้าจอสัมผัสหรือแป้นกดหมายเลขโทรศัพท์นี้เป็นโทรศัพท์บ้านหรือโทรศัพท์มือถือหรือไม่ คุณเพียงแค่ต้องรู้ว่ามันหมุนได้หรือไม่ มันได้รับสืบทอด (หรือนำไปใช้) อินเตอร์เฟสที่สามารถหมุนได้
และที่สำคัญถ้าวันหนึ่งคุณสลับ Dialable ด้วยอันอื่น
......
public static void main(String[] args) {
Dialable myDialable = SomeLibrary.PHONE2; // <-- changed from PHONE1 to PHONE2
SomeOtherLibrary.doSomethingUsingADialable(myDialable);
}
.....
คุณสามารถมั่นใจได้ว่ารหัสยังคงทำงานได้อย่างสมบูรณ์เพราะฟังก์ชั่นที่ใช้การโทรออกไม่ได้ (และไม่สามารถ) ขึ้นอยู่กับรายละเอียดอื่น ๆ นอกเหนือจากที่ระบุไว้ในอินเตอร์เฟซแบบ Dialable พวกเขาทั้งสองใช้อินเตอร์เฟส Dialable และเป็นสิ่งเดียวที่ฟังก์ชั่นใส่ใจ
อินเทอร์เฟซถูกใช้โดยนักพัฒนาเพื่อให้แน่ใจว่าการทำงานร่วมกัน (ใช้สลับกันได้) ระหว่างวัตถุเท่าที่พวกเขาแบ่งปันฟังก์ชั่นทั่วไป (เช่นคุณอาจเปลี่ยนเป็นโทรศัพท์บ้านหรือโทรศัพท์มือถือเท่าที่คุณต้องกดหมายเลข) กล่าวโดยสรุปอินเตอร์เฟสเป็นคลาสนามธรรมที่ง่ายกว่ามากโดยไม่มีคุณสมบัติใด ๆ
นอกจากนี้โปรดทราบว่าคุณสามารถใช้ (รับช่วง) เป็นอินเทอร์เฟซได้มากเท่าที่คุณต้องการ แต่คุณสามารถขยาย (สืบทอด) คลาสพาเรนต์เดียวเท่านั้น
ข้อมูลเพิ่มเติม
คลาสที่เป็นนามธรรม vs การเชื่อมต่อ