ฉันจะอธิบายประโยชน์ของการสืบทอดได้อย่างไร [ปิด]


16

เมื่อพยายามอธิบายแนวคิดของการสืบทอดใน OOP ตัวอย่างทั่วไปมักเป็นตัวอย่างสัตว์เลี้ยงลูกด้วยนม IMHO นี่เป็นตัวอย่างที่ไม่ดีจริงๆเพราะมันจะทำให้มือใหม่ใช้แนวคิดนี้ในทางที่ผิด และยิ่งไปกว่านั้นมันไม่ใช่การออกแบบทั่วไปที่พวกเขาจะต้องเผชิญในงานออกแบบประจำวัน

ดังนั้นสิ่งที่จะเป็นปัญหาที่ดีเรียบง่ายและเป็นรูปธรรมที่แก้ไขได้โดยใช้มรดก?


1
"ตัวอย่างทั่วไปมักเป็นสัตว์เลี้ยงลูกด้วยนม"? คุณหมายถึงอะไร คุณสามารถให้ลิงค์อ้างอิงหรืออ้างถึงสิ่งนี้ได้หรือไม่?
S.Lott


3
ตัวอย่างจริงที่ดีที่สุดในการอธิบายถึงประโยชน์ของกองทุนทรัสต์เพื่อลูกของ Bill Gates คืออะไร?
Martin Beckett

1
@Chris: คำถามนี้ไม่สร้างสรรค์อย่างไร คุณประกาศว่าผู้ถามหนึ่งคนและผู้ตอบ 14 คนกำลังเสียเวลากับทุกคนหรือไม่?
Dan Dascalescu

@DanDascalescu - มันถูกปิดเมื่อสองปีที่ผ่านมาเพื่อตอบสนองต่อการระบุธง "โปรดพิจารณาปิดที่ไม่สร้างสรรค์: ตัดสินโดยคำตอบที่ซ้อนกันมันดูเหมือนคำถามทั่วไป / คำถามสำรวจความคิดเห็น" หากคุณคิดว่านี่เป็นสิ่งที่ผิดให้แก้ไขเพื่อให้ชัดเจนว่าไม่ใช่และให้ชุมชนตัดสินใจผ่านคิวการตรวจสอบอีกครั้ง
ChrisF

คำตอบ:


15

ไม่มีอะไรผิดปกติกับตัวอย่างทางวิชาการล้วนๆเช่นสัตว์เลี้ยงลูกด้วยนม ฉันชอบตัวอย่างสี่เหลี่ยมผืนผ้า / สแควร์เพราะมันชี้ให้เห็นว่าทำไม taxonomies ในโลกแห่งความเป็นจริงไม่ได้แปลความสัมพันธ์การสืบทอดที่คุณคาดหวังเสมอ

ในความคิดของฉันตัวอย่างที่ยอมรับมากที่สุดทุกวันคือชุดเครื่องมือ GUI มันเป็นสิ่งที่ทุกคนใช้ แต่ผู้เริ่มต้นอาจไม่มีเหตุผลเกี่ยวกับวิธีการทำงานภายใต้ประทุน คุณสามารถพูดคุยเกี่ยวกับพฤติกรรมที่พบได้ทั่วไปในคอนเทนเนอร์ทั้งหมดวิดเจ็ตทั้งหมดเหตุการณ์ ฯลฯ โดยไม่ต้องใช้ความรู้โดยละเอียดเกี่ยวกับการใช้งานที่กำหนด


5
+1 สำหรับชุดเครื่องมือ GUI ... และฉันก็ชอบตัวอย่างรูปร่างด้วยหนึ่งรูปร่างเป็นฐานที่มีการวาดขั้นต่ำ () และรูปร่างลูกหลานที่มีการวาดที่กำหนดเอง ()
yati sagade

14

ตัวอย่างโลกแห่งความจริงของฉันคือโมเดลโดเมนของแอปพลิเคชั่น HR อย่างง่าย ฉันบอกว่าเราสามารถสร้างคลาสพื้นฐานชื่อพนักงานได้แน่นอนผู้จัดการก็เป็นพนักงานเช่นกัน

public class Employee
{
    public string FirstName { get; set; }

    public string LastName { get; set; }

    public int Code { get; set; }

    public string GetInsuranceHistory()
    {
        // Retrieving insurance history based on employee code.
    }
}

แล้วฉันจะอธิบายว่านักพัฒนามีพนักงาน , ทดสอบกำลังพนักงาน , ผู้จัดการโครงการเป็นพนักงาน ดังนั้นพวกเขาทั้งหมดสามารถสืบทอดจากชั้นพนักงาน


2
เพื่อแสดงให้เห็นถึงข้อได้เปรียบในการสืบทอดมันอาจเป็นเรื่องที่น่าสนใจที่จะแสดงให้เห็นว่านักพัฒนาแตกต่างจากพนักงานอย่างไร หากไม่มีความแตกต่างก็ไม่จำเป็นต้องสร้างคลาส Developer เลย
เดวิด

3
ดูเหมือนว่าEmployeeจะเป็นabstractคลาสก็ได้เช่นกัน
StuperUser

+1 นี่คือตัวอย่างที่ครูส่วนใหญ่ใช้และฉันชอบมาก มันสมเหตุสมผลและให้ตัวอย่างโลกแห่งความจริงเกี่ยวกับวิธีการใช้มรดก
David Peterman

18
ยกเว้นนี้ไม่เคยทำงานในทางปฏิบัติเพราะมีเสมออย่างน้อยหนึ่งคนที่จะต้องมีทั้งสองและDeveloper Testerอีกสถานการณ์ที่คล้ายกันคือฐานข้อมูลผู้ติดต่อที่คุณมีCustomerและSupplierในขณะที่ทุกคนที่สร้างระบบดังกล่าวจะบอกคุณว่ามีCompanyทั้งสองกรณี นั่นเป็นเหตุผลที่ตัวอย่างเหล่านี้ส่วนใหญ่นำคุณไปในทิศทางที่ผิด
Scott Whitlock

11

แค็ปซูลสิ่งที่แตกต่าง ... แสดงให้พวกเขาเห็นรูปแบบวิธีการเทมเพลตมันแสดงให้เห็นถึงประโยชน์ของการสืบทอดโดยการใส่พฤติกรรมทั่วไปในคลาสฐานและการห่อหุ้มพฤติกรรมที่แตกต่างในคลาสย่อย

UI controlsและStreamsยังเป็นตัวอย่างที่ดีสำหรับประโยชน์ของการสืบทอด


ฉันคิดว่าโรงงานจะเป็นตัวอย่างที่ดีกว่า
Let_Me_Be

1
@Let_Me_Be: ฉันคิดว่าความสัมพันธ์ระหว่างโรงงานกับการสืบทอดนั้นเป็นไปในลักษณะทางอ้อมเกินไป แน่นอนว่ามันสร้างประเภทที่เป็นรูปธรรมและส่งกลับประเภทนามธรรม / ฐาน แต่ก็สามารถกลับมาเป็นเพียงประเภทอินเตอร์เฟส! Imho นั้นไม่ได้ดีไปกว่าตัวอย่างสัตว์คลาสสิค
เหยี่ยว

@Let_Me_Be: นอกจากนี้โรงงานนามธรรมค่อนข้างเป็นตัวอย่างที่ซับซ้อนที่เกี่ยวข้องกับลำดับชั้นการสืบทอดที่แตกต่างกัน (หนึ่งรายการสำหรับหนึ่งรายการสำหรับโรงงาน) ฉันคิดว่ามันเป็นการใช้มรดกอย่างดี แต่ไม่ใช่ตัวอย่างที่ดีและเรียบง่าย
เหยี่ยว

3

จำ

ตัวอย่างของวัตถุทุกชิ้นเป็นตัวอย่างที่ชัดเจนของประโยชน์ของการสืบทอด!

หากคุณหมายถึงการสืบทอดคลาสเฉพาะตอนนี้คุณอยู่ในโลกของ taxonomies และสิ่งเหล่านั้นจะแตกต่างกันไปตามเป้าหมายของระบบที่ใช้พวกเขา ตัวอย่างสัตว์ / สัตว์เลี้ยงลูกด้วยนมใช้อนุกรมวิธานทั่วไปที่คุ้นเคยและหวังว่ามาจากชีววิทยา แต่เป็น (ตามที่คุณพูดถึง) เกือบไร้ประโยชน์สำหรับปัญหาการเขียนโปรแกรมส่วนใหญ่

ดังนั้นลองทำสิ่งที่เป็นสากล: แนวคิดของโปรแกรม ทุกโปรแกรมเริ่มทำงานและสิ้นสุด ทุกโปรแกรมมีชื่อและพารามิเตอร์บรรทัดคำสั่งเพิ่มเติม ดังนั้นคลาสโปรแกรมพื้นฐานจะมีประโยชน์มากในการเริ่มต้นดำเนินการจับและประมวลผลอาร์กิวเมนต์บรรทัดคำสั่งรันตรรกะหลักและปิดลงอย่างสวยงาม

นี่คือเหตุผลว่าทำไมภาษาโปรแกรมเชิงวัตถุจำนวนมากจึงมีคลาสโปรแกรมหรือสิ่งที่มีลักษณะเหมือนกับคลาสโปรแกรม


ดังนั้นคุณโปรแกรมโปรแกรมที่มีหลายโปรแกรมในนั้น? :) จากประสบการณ์ของฉัน Programm Objects มักเป็นซิงเกิลตันที่ไม่มีการสืบทอดดังนั้นอิโมะจึงไม่ใช่ตัวอย่างที่ดีที่สุด
keppla

@keppla: คุณเคยใช้ Java หรือ. NET หรือไม่? .NET มีคลาสของโปรแกรมที่ชัดเจนโดย Java เป็นนัย พวกเขาไม่ใช่คนโสด
Steven A. Lowe

ฉันใช้ Java, ประมาณเวอร์ชัน 1.4.2 ก่อนหน้านั้นมีเพียงโมฆะหลักคงที่ดังนั้นฉันคิดว่ามันเปลี่ยนไปเล็กน้อย อะไรเป็นเหตุผลโดยทั่วไปที่มีอินสแตนซ์ของคลาส Programm มากกว่าหนึ่ง
keppla

@keppla: โมฆะหลักคงที่ของจาวาทำให้การเข้าชั้นเรียนเป็นตัวแทนของโปรแกรม ผู้ใช้ทุกคนที่เรียกใช้โปรแกรมของคุณสร้างอินสแตนซ์ใหม่ของมัน ในขณะนี้ฉันมี Google Chrome สามอินสแตนซ์ที่ทำงานเอกสาร Word สี่อันแผ่นจดบันทึกสามอันและ Windows Explorers สองอัน หากพวกเขาเป็นซิงเกิลทั้งหมดฉันจะไม่สามารถทำเช่นนั้นได้
Steven A. Lowe

1
ฉันคิดว่าคุณยืดความหมายเล็กน้อย class Programm { public static void main(String[] args) { system.out.println('hello world'); }}เป็นโปรแกรม Java ขั้นต่ำ เมื่อฉันเรียกมันว่าไม่มีอินสแตนซ์ของโปรแกรม โปรแกรมไม่ได้รับมรดกจากสิ่งใด เมื่อฉันเริ่มต้น 3 โพรเซส (เหมือนกับที่คุณทำกับ crhome) อาจมี 3 โปรแกรม แต่ในแต่ละพื้นที่ของหน่วยความจำยังมีเพียงหนึ่งโปรแกรม Imho ซิงเกิลหมายถึง 'อินสแตนซ์เดียวเท่านั้นต่อกระบวนการ' ไม่ใช่ต่อเครื่องจักร ถ้าเป็นเช่นนั้นคงเป็นไปไม่ได้ที่จะสร้างซิงเกิลตันไม่มีอะไรหยุดคุณจากการรันโค้ดใด ๆ สองครั้ง
keppla

3

ฉันกำลังทำงานกับกล้องในที่ทำงาน เรามีอุปกรณ์ที่เชื่อมต่อกับรุ่นที่แตกต่างกันดังนั้นเราจึงมี "คลาสกล้อง" ที่เป็นนามธรรมและทุกรุ่นสืบทอดจากคลาสนี้เพื่อรองรับฟังก์ชั่นเฉพาะของกล้องนั้น มันเป็นตัวอย่างของโลกแห่งความจริงและไม่ยากที่จะเข้าใจ


2
ซึ่งอาจทำลายลงถ้าคุณมีเช่นรูปแบบที่ทั้งสองCameraและPhone(ที่เราทุกคนทำในกระเป๋าของเราตอนนี้) คลาสพื้นฐานใดที่ควรสืบทอดจาก หรือไม่ควรใช้ทั้งICameraและIPhoneอินเตอร์เฟส? (ha ha)
Scott Whitlock

2
@Scott: คุณไม่สามารถใช้อินเทอร์เฟซ iPhone หรือคุณจะถูกฟ้องร้องจาก Apple
Mason Wheeler

3

ตัวอย่างองค์ประกอบทางเคมี

นี่เป็นอีกตัวอย่างที่โผล่ออกมาจากสมองของฉัน:

องค์ประกอบคลาส _
{
    น้ำหนักอะตอมคู่ // น้ำหนักอะตอมขององค์ประกอบ
    เลขอะตอมคู่ // จำนวนอะตอมขององค์ประกอบ
    คุณสมบัติของสตริง; // คุณสมบัติขององค์ประกอบ
    // อื่น ๆ ถ้ามี
}


ชั้นไอโซโทปขยาย Element_ // มีไอโซโทปขององค์ประกอบอยู่ได้
{
    halflife สองเท่า
   // อื่น ๆ ถ้ามี

}

2
แม้ว่า atomicNumber สามารถ (ควร) อาจจะเป็นจำนวนเต็ม ...
แอนดรู

ฉันจะไม่ใช้มรดกสำหรับสิ่งนั้น ไม่ได้เป็นกรณีพิเศษisotope Elemenetฉันอยากจะมีทรัพย์สินในElement Isotope
CodesInChaos

2

ตัวอย่างในโลกแห่งความเป็นจริงมักจะทำผิดเพราะพวกเขาให้ตัวอย่างที่มีความเป็นไปได้ของบางสิ่งบางอย่างที่เป็นทั้งคู่TypeAและTypeBแต่ลำดับชั้นการสืบทอดเดี่ยวของหลายภาษาไม่อนุญาต

ยิ่งฉันเขียนโปรแกรมมากเท่าไหร่ก็ยิ่งได้รับมรดกมากขึ้นเท่านั้น

แม้แต่คำว่า "การสืบทอด" ก็ถูกนำมาใช้อย่างไม่เหมาะสมที่นี่ ตัวอย่างเช่นคุณได้รับมรดกประมาณ 50% ของคุณลักษณะของพ่อและ 50% ของคุณสมบัติของคุณแม่ จริง ๆ แล้ว DNA ของคุณเป็นองค์ประกอบของ DNA ครึ่งพ่อของคุณและครึ่งหนึ่งของ DNA แม่ของคุณ นั่นเป็นเพราะชีววิทยาสนับสนุนการจัดเรียงมรดกจริง ๆและคุณก็ควรเช่นกัน

เพียงใช้อินเทอร์เฟซหรือ "ดีกว่า" การพิมพ์เป็ด "รวมถึงการฉีดพึ่งพาเป็นสิ่งที่ดีกว่ามากในการสอนคนที่ยังใหม่กับการเขียนโปรแกรมเชิงวัตถุ


1

ฉันแค่แสดงให้พวกเขาเห็นตัวอย่างในชีวิตจริง ตัวอย่างเช่นในเฟรมเวิร์ก UI ส่วนใหญ่คุณได้รับคลาส "โต้ตอบ" หรือ "หน้าต่าง" หรือ "ควบคุม" บางอย่างเพื่อสร้างของคุณเอง


1

ตัวอย่างที่ดีคือฟังก์ชันการเปรียบเทียบในการเรียงลำดับ:

template<class T>
class CompareInterface {
public:
   virtual bool Compare(T t1, T t2) const=0;
};
class FloatCompare : public CompareInterface<float> { };
class CompareImplementation : public FloatCompare {
public:
   bool Compare(float t1, float t2) const { return t1<t2; }
};
template<class T>
void Sort(T*array, int size, CompareInterface<T> &compare);

ปัญหาเดียวคือมือใหม่บ่อยเกินไปคิดว่าประสิทธิภาพสำคัญกว่ารหัสที่ดี ...


0

ตัวอย่างโลกแห่งความจริงของฉันคือยานพาหนะ:

public class Vehicle
{
    public Vehicle(int doors, int wheels)
    {
        // I describe things that should be
        // established and "unchangeable" 
        // when the class is first "made"
        NumberOfDoors = doors;
        NumberOfWheels = wheels;
    }

    public void RollWindowsUp()
    {
        WindowsUp = true;
    }

    // I cover modifiers on properties to show
    // how to protect certain things from being
    // overridden
    public int NumberOfDoors { get; private set; }
    public int NumberOfWheels { get; private set; }

    public string Color { get; set; }
    public bool WindowsUp { get; set; }
    public int Speed { get; set; }
}

public class Car : Vehicle
{
    public Car : base(4, 4)
    {

    }
}

public class SemiTruck : Vehicle
{
    public SemiTruck : base(2, 18)
    {

    }
}

ตัวอย่างนี้สามารถรับรายละเอียดได้ตามที่คุณต้องการและมีคุณสมบัติทุกชนิดที่ติดอยู่กับยานพาหนะเพื่ออธิบายการใช้งานตัวดัดแปลงใด ๆ ที่คุณอาจต้องการสอน


2
ฉันเกลียดการใช้ยานพาหนะเป็นตัวอย่างอยู่เสมอเนื่องจากมันไม่ได้ทำให้โปรแกรมเมอร์ใหม่เข้าใจถึงวิธีการใช้การสืบทอดเพื่อปรับปรุงรหัส ยานพาหนะเป็นเครื่องจักรที่ซับซ้อนอย่างมากที่เรียกความคิดที่ไม่เป็นนามธรรมจำนวนมากในใจของผู้ที่ไม่ใช่โปรแกรมเมอร์ การพยายามอธิบายเรื่องนี้ในโค้ดทำให้ผู้เริ่มหัดโดยเฉลี่ยเชื่อว่ามีรายละเอียดมากมายเหลือเกินจากตัวอย่างและให้ความรู้สึกว่าพวกเขาไม่ได้ใกล้ชิดกับการทำงานมากขึ้น ผมพูดนี้จากประสบการณ์เป็นที่ว่าวิธีการที่ฉันรู้สึกว่าเมื่อมีคนพยายามที่จะใช้ยานพาหนะที่จะอธิบายให้ฉัน
riwalk

@ Stargazer712: ฉันใช้ยานพาหนะเป็นหลักเพราะมันอาจจะซับซ้อนหรือเรียบง่ายเท่าที่คุณต้องการ ฉันปล่อยให้มันเป็นดุลยพินิจของผู้สอนเพื่อกำหนดระดับนักเรียนของเขา ฉันอธิบาย OOP ขั้นพื้นฐานให้กับภรรยาของฉัน (ซึ่งไม่มีประสบการณ์การเขียนโปรแกรมเป็นศูนย์) โดยใช้คุณสมบัติง่าย ๆ ของยานพาหนะที่อธิบายพื้นฐานทั่วไป ยานพาหนะทุกคันมีประตูรถทุกคันมีล้อ ฯลฯ ตัวอย่างของวัตถุไม่สามารถถูกตำหนิได้สำหรับแผนการสอนที่ไม่ดี
Joel Etherton

ภรรยาของคุณไม่ได้พยายามเขียนรหัส ฉันจะมากได้อย่างปลอดภัยกล่าวว่าตัวอย่างรถไม่ได้ทำอะไรที่จะช่วยให้ฉันเข้าใจมรดก สิ่งที่คุณใช้ในการอธิบายถึงการถ่ายทอดทางพันธุกรรมก็จะต้องสมบูรณ์และในทางปฏิบัติ เป้าหมายไม่ได้อธิบายไว้ในลักษณะที่ผู้ที่ไม่ใช่โปรแกรมเมอร์สามารถเข้าใจได้ เป้าหมายคือการอธิบายในลักษณะที่โปรแกรมเมอร์สามเณรสามารถใช้งานได้และวิธีเดียวที่จะทำคือแสดงตัวอย่างมือใหม่ว่าโปรแกรมเมอร์มืออาชีพจะใช้งานอย่างไร
riwalk

@ Stargazer712: ฉันจะทำให้คุณไม่สามารถเข้าใจการสืบทอดในตอนแรกของแผนการสอนที่ไม่ดี ฉันยังใช้ยานพาหนะเพื่ออธิบายการถ่ายทอดทางพันธุกรรมให้กับรุ่นน้องที่ฉันทำงานด้วยและฉันไม่เคยมีปัญหากับแนวคิดที่เจอ ในความคิดของฉันถ้าแผนการสอนมีความละเอียดและสร้างอย่างเหมาะสมวัตถุยานพาหนะนั้นทั้งสมบูรณ์และใช้งานได้จริง 1 คนที่สุ่มบนอินเทอร์เน็ตจะไม่เปลี่ยนแปลงสิ่งนี้เมื่อเผชิญกับผู้ฝึกงาน 30 คนและผู้ฝึกหัดรุ่นเยาว์ที่ฉันสอน OOP หากคุณไม่ชอบรถลงคะแนนเสียงและไปข้างหน้า
Joel Etherton

ตามที่คุณต้องการ ....
riwalk

0

ตัวอย่างที่ไม่ใช่สัตว์เลี้ยงลูกด้วยนมที่ไม่ใช่นกและไม่ใช่ปลานี้อาจช่วย:

public abstract class Person {

    /* this contains thing all persons have, like name, gender, home addr, etc. */

    public Object getHomeAddr() { ... }

    public Person getName() { ... }

}

public class Employee extends Person{

    /* It adds things like date of contract, salary, position, etc */

    public Object getAccount() { ... }

}

public abstract class Patient extends Person {
    /* It adds things like medical history, etc */
}

แล้วก็

public static void main(String[] args) {

    /* you can send Xmas cards to patients and employees home addresses */

    List<Person> employeesAndPatients = Factory.getListOfEmployeesAndPatients();

    for (Person p: employeesAndPatients){
        sendXmasCard(p.getName(),p.getHomeAddr());
    }

    /* or you can proccess payment to employees */

    List<Employee> employees = Factory.getListOfEmployees();

    for (Employee e: employees){
        proccessPayment(e.getName(),e.getAccount());
    }       

}

หมายเหตุ: อย่าบอกความลับ: บุคคลขยาย Mammal


1
ทำงานจนกว่าพนักงานของคุณจะเป็นผู้ป่วย
Scott Whitlock

ในกรณีนี้ฉันคิดว่ามันเหมาะสมกว่าที่จะประกาศผู้ป่วยและพนักงานเป็นส่วนต่อประสานแทนที่จะเป็นคลาสนามธรรม ที่ช่วยให้คุณมีความยืดหยุ่นในการมีคนใช้หลายอินเตอร์เฟส
Jin Kim

@JinKim - ฉันเห็นด้วยอย่างยิ่งนั่นเป็นวิธีที่ดีกว่า
Scott Whitlock

@JinKim พวกเขาไม่ได้ จำกัด เฉพาะ คุณปฏิบัติต่อบุคคลในฐานะลูกจ้างหรือผู้ป่วยในเวลาใดก็ตาม แต่ไม่ใช่ในเวลาเดียวกัน สองอินเตอร์เฟสก็โอเค แต่เมื่อคุณเรียกใช้คลาสที่เป็นรูปธรรมซึ่งทั้งสองใช้ EmployeePatient คุณจะมีชุดค่าผสมกี่ชุด
Tulains Córdova

คุณสามารถเรียกคลาสที่เป็นรูปธรรมตามที่คุณต้องการ หากรหัสคาดว่าจะจัดการกับพนักงานเท่านั้นคุณจะประกาศการอ้างอิงเป็นพนักงาน (เช่นพนักงานลูกจ้าง = คนใหม่ ();) หากรหัสคาดว่าจะเกี่ยวข้องกับผู้ป่วยเท่านั้นคุณจะประกาศการอ้างอิงในฐานะผู้ป่วย คุณต้องการประกาศการอ้างอิงโดยตรงเป็นคลาสคอนกรีต
จินคิม

0

วิธีการเกี่ยวกับลำดับชั้นของการแสดงออกเกี่ยวกับพีชคณิต เป็นสิ่งที่ดีเพราะมันมีทั้งการถ่ายทอดและองค์ประกอบ:

+--------------------+------------------------+
| Expression         |<------------------+    |
+--------------------+----------+        |    |
| + evaluate(): int  |<---+     |        |    |
+--------------------+    |     |        |    |
          ^               |     |        |    |
          |               |     |        |    |
   +--------------+  +---------------+  +-------------+  ...
   | Constant     |  | Negation      |  | Addition    |
   +--------------+  +---------------+  +-------------+
   | -value: int  |  |               |  |             |
   +--------------+  +---------------+  +-------------+
   | +evaluate()  |  | +evaluate()   |  | +evaluate() |
   | +toString()  |  | +toString()   |  | +toString() |
   +--------------+  +---------------+  +-------------+

   Addition(Constant(5), Negation(Addition(Constant(3),Constant(2))))
   (5 + -(3 + 2)) = 0

ด้วยข้อยกเว้นของนิพจน์รูตค่าคงที่นิพจน์อื่นทั้งหมดเป็นทั้งนิพจน์และมีหนึ่งนิพจน์หรือมากกว่า


-1

ฉันจะใช้นกเป็นตัวอย่าง

เหมือนไก่เป็ดนกอินทรี

ฉันจะอธิบายว่าทั้งสองมีกรงเล็บถากและปีก แต่คุณลักษณะของพวกมันนั้นแตกต่างกัน

ไก่ไม่สามารถบินได้ว่ายน้ำไม่สามารถกินเวิร์มกินธัญพืชได้

เป็ดบินไม่ได้สามารถว่ายน้ำกินธัญพืชกินหนอนไม่ได้

นกอินทรีสามารถบินได้ว่ายน้ำไม่ได้กินหนอนไม่สามารถกินธัญพืชได้


4
ฉันเคยอ่านว่าองค์ประกอบและอินเทอร์เฟซน่าจะเป็นวิธีที่ดีที่สุดในการถ่ายทอดแนวคิดประเภทนี้เช่นบินว่ายน้ำ ฯลฯ
dreza

เป็ดไม่สามารถบินได้!
Adam Cameron

-3

Rails-clone ทั่วไปของคุณมีตัวอย่างการใช้งานจริงมากมาย : คุณมีคลาสโมเดลพื้นฐาน (นามธรรม) ที่สรุปการจัดการข้อมูลทั้งหมดและคุณมีคลาสคอนโทรลเลอร์ฐานที่ห่อหุ้มการสื่อสาร HTTP ทั้งหมด


สนใจที่จะอธิบายอย่างละเอียดว่าทำไมคำตอบนี้ไม่ดี?
keppla
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.