คำถามติดแท็ก inheritance

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

7
จะเรียกคุณสมบัติของคลาสฐานได้อย่างไรหากคุณสมบัตินี้ถูกเขียนทับในคลาสที่ได้รับ
ฉันกำลังเปลี่ยนคลาสของฉันจากการใช้ getters และ setters อย่างกว้างขวางเป็นการใช้คุณสมบัติ pythonic มากขึ้น แต่ตอนนี้ฉันติดขัดเพราะ getters หรือ setters ก่อนหน้าของฉันบางคนจะเรียกเมธอดที่สอดคล้องกันของคลาสพื้นฐานแล้วดำเนินการอย่างอื่น แต่จะสำเร็จด้วยสรรพคุณได้อย่างไร? จะเรียกคุณสมบัติ getter หรือ setter ในคลาสพาเรนต์ได้อย่างไร? แน่นอนว่าการเรียกใช้แอตทริบิวต์นั้นจะทำให้เกิดการเรียกซ้ำไม่สิ้นสุด class Foo(object): @property def bar(self): return 5 @bar.setter def bar(self, a): print a class FooBar(Foo): @property def bar(self): # return the same value # as in the base class return self.bar …

2
ตัวดำเนินการ 'instanceof' ทำงานแตกต่างกันไปสำหรับอินเทอร์เฟซและคลาส
ฉันต้องการทราบเกี่ยวกับพฤติกรรมต่อไปนี้ของinstanceofตัวดำเนินการใน Java interface C {} class B {} public class A { public static void main(String args[]) { B obj = new B(); System.out.println(obj instanceof A); //Gives compiler error System.out.println(obj instanceof C); //Gives false as output } } ทำไมจึงเป็นเช่นนั้น? ไม่มีความสัมพันธ์ระหว่างinterface Cและclass Bแต่ให้เท็จในขณะที่obj instanceof Aให้คอมไพเลอร์ผิดพลาด?

3
Objective-C หลายมรดก
ฉันมี 2 คลาสหนึ่งมี methodA และอีกคลาสรวม methodB ดังนั้นในคลาสใหม่ฉันต้องแทนที่ method methodA และ methodB ดังนั้นฉันจะบรรลุการสืบทอดหลายรายการในวัตถุประสงค์ C ได้อย่างไร ฉันสับสนเล็กน้อยกับไวยากรณ์

6
จะสร้างโมเดล RESTful API ด้วยการสืบทอดได้อย่างไร
ฉันมีลำดับชั้นของออบเจ็กต์ที่ต้องแสดงผ่าน RESTful API และฉันไม่แน่ใจว่า URL ของฉันควรมีโครงสร้างอย่างไรและควรส่งคืนอะไร ฉันไม่พบแนวทางปฏิบัติที่ดีที่สุด สมมติว่าฉันมีสุนัขและแมวที่สืบทอดมาจากสัตว์ ฉันต้องการการผ่าตัด CRUD กับสุนัขและแมว ฉันยังต้องการที่จะดำเนินการกับสัตว์โดยทั่วไป ความคิดแรกของฉันคือการทำสิ่งนี้: GET /animals # get all animals POST /animals # create a dog or cat GET /animals/123 # get animal 123 สิ่งนี้คือตอนนี้คอลเลกชัน / สัตว์ "ไม่สอดคล้องกัน" เนื่องจากสามารถส่งคืนและรับวัตถุที่ไม่มีโครงสร้างเหมือนกัน (สุนัขและแมว) ถือว่า "RESTful" มีคอลเล็กชันที่ส่งคืนอ็อบเจ็กต์ที่มีแอตทริบิวต์ต่างกันหรือไม่ อีกวิธีหนึ่งคือการสร้าง URL สำหรับคอนกรีตแต่ละประเภทดังนี้: GET /dogs # get all …

17
การลบล้างและการซ่อน Java - สับสน
ฉันสับสนว่าการลบล้างแตกต่างจากการซ่อนใน Java อย่างไร ใครช่วยให้รายละเอียดเพิ่มเติมว่าสิ่งเหล่านี้แตกต่างกันอย่างไร ฉันอ่านJava Tutorialแต่โค้ดตัวอย่างยังทำให้ฉันสับสน เพื่อให้ชัดเจนยิ่งขึ้นฉันเข้าใจการลบล้างได้ดี ปัญหาของฉันคือฉันไม่เห็นว่าการซ่อนแตกต่างกันอย่างไรยกเว้นความจริงที่ว่าหนึ่งอยู่ในระดับอินสแตนซ์ในขณะที่อีกอันอยู่ในระดับชั้นเรียน ดูโค้ดสอน Java: public class Animal { public static void testClassMethod() { System.out.println("Class" + " method in Animal."); } public void testInstanceMethod() { System.out.println("Instance " + " method in Animal."); } } จากนั้นเรามีคลาสย่อยCat: public class Cat extends Animal { public static void testClassMethod() …

1
การแปลงจาก * มาเป็นฐาน * มีอยู่ แต่ไม่สามารถเข้าถึงได้
เหตุใดโค้ด follwing จึงสร้างข้อผิดพลาดนี้แม้ว่า c จะเป็นโครงสร้างและมีการสืบทอดสาธารณะโดยค่าเริ่มต้น ?? struct c { protected: int i; public: c(int ii=0):i(ii){} virtual c *fun(); }; c* c::fun(){ cout<<"in c"; return &c(); } class d : c { public: d(){} d* fun() { i = 9; cout<<"in d"<<'\t'<<i; return &d(); } }; int main() { c *cc; …
88 c++  inheritance 

6
การสืบทอดและการเรียกซ้ำ
สมมติว่าเรามีคลาสต่อไปนี้: class A { void recursive(int i) { System.out.println("A.recursive(" + i + ")"); if (i > 0) { recursive(i - 1); } } } class B extends A { void recursive(int i) { System.out.println("B.recursive(" + i + ")"); super.recursive(i + 1); } } ตอนนี้ให้โทรrecursiveในคลาส A: public class Demo { public …

7
XML Serialization และประเภทที่สืบทอด
ต่อจากคำถามก่อนหน้าของฉันฉันได้ดำเนินการเพื่อรับโมเดลวัตถุของฉันเพื่อทำให้เป็นอนุกรมกับ XML แต่ตอนนี้ฉันประสบปัญหาแล้ว (แปลกใจ!) ปัญหาที่ฉันมีคือฉันมีคอลเล็กชันซึ่งเป็นประเภทคลาสฐานนามธรรมซึ่งบรรจุโดยประเภทที่ได้จากคอนกรีต ฉันคิดว่ามันจะเป็นการดีที่จะเพิ่มแอตทริบิวต์ XML ให้กับคลาสทั้งหมดที่เกี่ยวข้องและทุกอย่างจะเป็นสีพีช น่าเศร้าที่ไม่เป็นเช่นนั้น! ดังนั้นฉันได้ทำการขุดใน Google และตอนนี้ฉันเข้าใจแล้วว่าทำไมมันถึงไม่ทำงาน ในความXmlSerializerเป็นจริงแล้วการสะท้อนที่ชาญฉลาดเพื่อทำให้วัตถุเป็นอนุกรมเป็น / จาก XML และเนื่องจากมันขึ้นอยู่กับประเภทนามธรรมจึงไม่สามารถเข้าใจได้ว่ามันกำลังพูดถึงอะไร ละเอียด. ฉันเจอหน้านี้ใน CodeProject ซึ่งดูเหมือนว่ามันอาจช่วยได้มาก (ยังอ่าน / ใช้อย่างเต็มที่) แต่ฉันคิดว่าฉันอยากจะนำปัญหานี้ไปที่ตาราง StackOverflow ด้วยเพื่อดูว่าคุณเรียบร้อยหรือไม่ แฮ็ก / เทคนิคเพื่อให้สิ่งนี้เริ่มต้นใช้งานได้เร็วที่สุด / เบาที่สุด สิ่งหนึ่งที่ฉันควรเพิ่มก็คือฉันไม่ต้องการไปตามXmlIncludeเส้นทาง มีการเชื่อมต่อกับมันมากเกินไปและพื้นที่นี้ของระบบอยู่ระหว่างการพัฒนาอย่างหนักดังนั้นจึงน่าจะเป็นเรื่องที่น่าปวดหัวในการบำรุงรักษาอย่างแท้จริง!

2
การชนกันของเนมสเปซ C ++ ในตัวสร้างสำเนา
ฉันมีรหัสต่อไปนี้: namespace A { struct Foo { int a; }; } struct Foo { int b; }; struct Bar : public A::Foo { Bar(Foo foo) { c = foo.b; } int c; }; คอมไพเลอร์ C ++ บ่นที่ "c = foo.b" เนื่องจาก A :: Foo ไม่มีสมาชิกชื่อ b ถ้าฉันเปลี่ยนประเภทของพารามิเตอร์ Bar ด้วย :: …

1
เหตุใดขนาดของคลาสใน c ++ ขึ้นอยู่กับสถานะสาธารณะ / ส่วนตัวของสมาชิกข้อมูล
จากสิ่งที่ฉันรู้ขนาดของคลาสใน c ++ ขึ้นอยู่กับปัจจัยด้านล่าง - ขนาดของสมาชิกข้อมูลที่ไม่คงที่ทั้งหมด ลำดับของสมาชิกข้อมูล หากเปิดใช้งานการเสริมไบต์แล้วหรือไม่ ขนาดของคลาสฐานทันที การมีอยู่ของฟังก์ชั่นเสมือนจริง โหมดของการสืบทอด (การสืบทอดเสมือน) ตอนนี้ฉันได้สร้าง 2 ชั้นดังนี้ class A{ int a; short s; int b; char d; };// kept a char at last on purpose to leave a "hole" class B : public A{ char c; }; ตอนนี้ในการตรวจสอบขนาดของ A และ BI เห็น …

3
เหตุใดจึงทำให้ unique_ptr <Derived> ส่งไปยัง unique_ptr <Base> โดยปริยาย
ฉันเขียนรหัสต่อไปนี้ซึ่งใช้ในunique_ptr&lt;Derived&gt;ที่ที่unique_ptr&lt;Base&gt;คาดไว้ class Base { int i; public: Base( int i ) : i(i) {} int getI() const { return i; } }; class Derived : public Base { float f; public: Derived( int i, float f ) : Base(i), f(f) {} float getF() const { return f; } }; void …

7
การแบ่งคลาสย่อย: เป็นไปได้หรือไม่ที่จะแทนที่คุณสมบัติด้วยแอตทริบิวต์ดั้งเดิม?
โปรดปรานหมดอายุใน 3 วัน คำตอบสำหรับคำถามนี้มีสิทธิ์ได้รับ500รางวัลชื่อเสียง พอลยานเกราะต้องการที่จะตอบแทนคำตอบที่มีอยู่ สมมติว่าเราต้องการสร้างตระกูลของคลาสที่มีการใช้งานที่แตกต่างกันหรือความเชี่ยวชาญเฉพาะของแนวคิดที่ครอบคลุม สมมติว่ามีการใช้งานเริ่มต้นที่เป็นไปได้สำหรับคุณสมบัติบางอย่างที่ได้รับมา เราต้องการใส่มันลงในคลาสฐาน class Math_Set_Base: @property def size(self): return len(self.elements) ดังนั้นคลาสย่อยจะสามารถนับองค์ประกอบโดยอัตโนมัติในตัวอย่างที่ค่อนข้างงี่เง่า class Concrete_Math_Set(Math_Set_Base): def __init__(self,*elements): self.elements = elements Concrete_Math_Set(1,2,3).size # 3 แต่ถ้าหากคลาสย่อยไม่ต้องการใช้ค่าเริ่มต้นนี้ สิ่งนี้ไม่ทำงาน: import math class Square_Integers_Below(Math_Set_Base): def __init__(self,cap): self.size = int(math.sqrt(cap)) Square_Integers_Below(7) # Traceback (most recent call last): # File "&lt;stdin&gt;", line 1, in …

1
ทำไมการปรับฐานว่างเปล่าจึงถูกห้ามเมื่อคลาสฐานที่ว่างเปล่าเป็นตัวแปรสมาชิกด้วย?
การเพิ่มประสิทธิภาพฐานที่ว่างเปล่าดีมาก อย่างไรก็ตามมันมาพร้อมกับข้อ จำกัด ดังต่อไปนี้: การเพิ่มประสิทธิภาพฐานว่างเปล่าเป็นสิ่งต้องห้ามหากหนึ่งในคลาสฐานที่ว่างเปล่าเป็นชนิดหรือฐานของประเภทของข้อมูลสมาชิกไม่คงที่ครั้งแรกเนื่องจาก subobjects ฐานสองประเภทเดียวกันจะต้องมีที่อยู่ที่แตกต่างกันภายในการแสดงวัตถุ ประเภทที่ได้รับมากที่สุด เพื่ออธิบายข้อ จำกัด นี้ให้พิจารณารหัสต่อไปนี้ static_assertจะล้มเหลว ในขณะที่การเปลี่ยนแปลงอย่างใดอย่างหนึ่งFooหรือBarเพื่อสืบทอดจากBase2จะเป็นการหลีกเลี่ยงข้อผิดพลาด: #include &lt;cstddef&gt; struct Base {}; struct Base2 {}; struct Foo : Base {}; struct Bar : Base { Foo foo; }; static_assert(offsetof(Bar,foo)==0,"Error!"); ฉันเข้าใจพฤติกรรมนี้อย่างสมบูรณ์ สิ่งที่ฉันไม่เข้าใจคือสาเหตุพฤติกรรมนี้โดยเฉพาะอย่างยิ่งที่มีอยู่ เห็นได้ชัดว่ามีการเพิ่มเข้ามาด้วยเหตุผลเนื่องจากเป็นการเพิ่มที่ชัดเจนไม่ใช่การกำกับดูแล เหตุผลนี้คืออะไร โดยเฉพาะอย่างยิ่งทำไม subobjects ทั้งสองควรจะต้องมีที่อยู่ที่แตกต่างกัน? ในข้างต้นBarเป็นประเภทและfooเป็นตัวแปรสมาชิกประเภทนั้น ฉันไม่เห็นว่าทำไมชั้นฐานของBarเรื่องถึงชั้นฐานของประเภทfooหรือในทางกลับกัน อันที่จริงฉันมีอะไรถ้าฉันคาดหวังว่า&amp;fooจะเป็นเช่นเดียวกับที่อยู่ของBarอินสแตนซ์ที่มีมัน - มันจะต้องอยู่ในสถานการณ์อื่น(1) (1)หลังจากทั้งหมดฉันไม่ได้ทำอะไรแฟนซีกับการvirtualสืบทอดคลาสพื้นฐานว่างเปล่าโดยไม่คำนึงถึงและการคอมไพล์ด้วยBase2แสดงว่าไม่มีอะไรแตกในกรณีนี้โดยเฉพาะ แต่ชัดเจนว่าเหตุผลนี้ไม่ถูกต้องอย่างใดอย่างหนึ่งและมีสถานการณ์อื่น ๆ …

2
เหตุใด destructor จึงถูกดำเนินการสองครั้ง
#include &lt;iostream&gt; using namespace std; class Car { public: ~Car() { cout &lt;&lt; "Car is destructed." &lt;&lt; endl; } }; class Taxi :public Car { public: ~Taxi() {cout &lt;&lt; "Taxi is destructed." &lt;&lt; endl; } }; void test(Car c) {} int main() { Taxi taxi; test(taxi); return 0; } นี่คือผลลัพธ์ …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.