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

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

5
วิธี "สมบูรณ์แบบ" จะแทนที่คำสั่ง?
ฉันจะทำให้คลาสย่อยของ " dict " สมบูรณ์แบบที่สุดได้อย่างไร เป้าหมายสุดท้ายคือการใช้dictแบบง่าย ๆซึ่งมีปุ่มเล็ก ๆ ดูเหมือนว่าควรมีชุดพื้นฐานเล็ก ๆ น้อย ๆ ที่ฉันสามารถแทนที่เพื่อให้งานนี้ แต่ตามการวิจัยของฉันทั้งหมดและความพยายามดูเหมือนว่านี่ไม่ใช่กรณี: หากฉันแทนที่__getitem__/__setitem__ดังนั้นget/ setไม่ได้ผล ฉันจะทำให้พวกเขาทำงานได้อย่างไร แน่นอนฉันไม่จำเป็นต้องใช้พวกเขาทีละรายการ? ฉันจะป้องกันการดองจากการทำงานและฉันจำเป็นต้องติดตั้ง__setstate__ฯลฯ หรือไม่? ฉันต้องrepr, updateและ__init__ ? ฉันควรใช้การทำแผนที่ที่ไม่แน่นอน (ดูเหมือนว่าไม่ควรใช้UserDict หรือDictMixin) ถ้าเป็นเช่นนั้นได้อย่างไร เอกสารไม่ได้ตรัสรู้อย่างแน่นอน นี่เป็นครั้งแรกของฉันไปที่มันget()ไม่ทำงานและไม่ต้องสงสัยเลยว่ามีปัญหาเล็ก ๆ น้อย ๆ อื่น ๆ อีกมากมาย: class arbitrary_dict(dict): """A dictionary that applies an arbitrary key-altering function before accessing the keys.""" def …


3
ต้นแบบที่ใช้กับการสืบทอดตามคลาส
ใน JavaScript วัตถุทุกตัวในเวลาเดียวกันเป็นอินสแตนซ์และคลาส ในการรับมรดกคุณสามารถใช้อินสแตนซ์ของวัตถุใด ๆ ก็ได้เป็นต้นแบบ ใน Python, C ++ ฯลฯ มีคลาสและอินสแตนซ์เป็นแนวคิดแยกต่างหาก ในการทำการสืบทอดคุณต้องใช้คลาสฐานเพื่อสร้างคลาสใหม่ซึ่งสามารถใช้เพื่อสร้างอินสแตนซ์ที่ได้รับ ทำไม JavaScript ไปในทิศทางนี้ (การวางวัตถุตามต้นแบบ) อะไรคือข้อดี (และข้อเสีย) ของต้นแบบ OO ที่เกี่ยวกับแบบดั้งเดิม OO แบบคลาส?

14
ความแตกต่างระหว่างใหม่และแทนที่
สงสัยว่าความแตกต่างระหว่างสิ่งต่อไปนี้: กรณีที่ 1: คลาสพื้นฐาน public void DoIt(); กรณีที่ 1: คลาสที่รับมา public new void DoIt(); กรณีที่ 2: คลาสฐาน public virtual void DoIt(); กรณีที่ 2: คลาสที่รับมา public override void DoIt(); ทั้งกรณีที่ 1 และ 2 ดูเหมือนว่าจะมีผลเหมือนกันตามการทดสอบที่ฉันใช้ มีความแตกต่างหรือวิธีที่ต้องการหรือไม่?

3
เหตุใดฉันจึงต้องเข้าถึงสมาชิกคลาสฐานแม่แบบผ่านตัวชี้นี้
หากคลาสด้านล่างไม่ใช่เทมเพลตฉันสามารถมีได้เฉพาะxในderivedคลาส แต่ด้วยรหัสข้างล่างนี้ผมต้องthis->xใช้ ทำไม? template <typename T> class base { protected: int x; }; template <typename T> class derived : public base<T> { public: int f() { return this->x; } }; int main() { derived<int> d; d.f(); return 0; }

10
คอนโทรลเลอร์ AngularJS สามารถสืบทอดจากคอนโทรลเลอร์อื่นในโมดูลเดียวกันได้หรือไม่?
ภายในโมดูลคอนโทรลเลอร์สามารถสืบทอดคุณสมบัติจากคอนโทรลเลอร์ภายนอก: var app = angular.module('angularjs-starter', []); var ParentCtrl = function ($scope, $location) { }; app.controller('ChildCtrl', function($scope, $injector) { $injector.invoke(ParentCtrl, this, {$scope: $scope}); }); ตัวอย่างผ่าน: Dead link : http://blog.omkarpatil.com/2013/02/controller-inheritance-in-angularjs.html สามารถควบคุมภายในโมดูลรับจากพี่น้อง? var app = angular.module('angularjs-starter', []); app.controller('ParentCtrl ', function($scope) { //I'm the sibling, but want to act as parent }); app.controller('ChildCtrl', function($scope, …

4
super () ล้มเหลวด้วยข้อผิดพลาด: TypeError“ อาร์กิวเมนต์ 1 ต้องเป็นประเภทไม่ใช่ classobj” เมื่อผู้ปกครองไม่สืบทอดจากวัตถุ
ฉันพบข้อผิดพลาดบางอย่างที่ไม่สามารถหาได้ เบาะแสอะไรที่ผิดปกติกับรหัสตัวอย่างของฉัน? class B: def meth(self, arg): print arg class C(B): def meth(self, arg): super(C, self).meth(arg) print C().meth(1) ฉันได้รับรหัสทดสอบตัวอย่างจากความช่วยเหลือของวิธีการในตัว 'super' นี่คือข้อผิดพลาด: Traceback (most recent call last): File "./test.py", line 10, in ? print C().meth(1) File "./test.py", line 8, in meth super(C, self).meth(arg) TypeError: super() argument 1 must be type, not …

13
ท่านจะไม่ได้รับมรดกจาก std :: vector
ตกลงนี้มันยากที่จะสารภาพ std::vectorแต่ฉันจะมีสิ่งล่อใจที่แข็งแกร่งในขณะนี้จะได้รับมรดกจาก ฉันต้องการอัลกอริทึมแบบกำหนดเองประมาณ 10 แบบสำหรับเวกเตอร์และฉันต้องการให้พวกเขาเป็นสมาชิกของเวกเตอร์โดยตรง แต่โดยธรรมชาติฉันต้องการมีส่วนstd::vectorต่อประสานที่เหลือ ความคิดแรกของฉันในฐานะพลเมืองที่ปฏิบัติตามกฎหมายคือการมีstd::vectorสมาชิกในMyVectorชั้นเรียน แต่จากนั้นฉันจะต้องทบทวนส่วนติดต่อทั้งหมดของ std :: vector อีกครั้งด้วยตนเอง พิมพ์มากเกินไป ต่อไปฉันนึกถึงมรดกส่วนตัวดังนั้นแทนที่จะใช้วิธีประณามฉันจะเขียนบทความหลายusing std::vector::memberเรื่องในส่วนสาธารณะ อันนี้น่าเบื่อจริง ๆ แล้ว และฉันอยู่ที่นี่ฉันคิดว่าฉันสามารถสืบทอดต่อสาธารณชนได้ง่ายstd::vectorๆ แต่ให้คำเตือนในเอกสารที่ว่าคลาสนี้ไม่ควรใช้ polymorphically ฉันคิดว่านักพัฒนาส่วนใหญ่มีความสามารถพอที่จะเข้าใจได้ว่าสิ่งนี้ไม่ควรใช้ polymorphically อยู่ดี การตัดสินใจของฉันเป็นการไม่ยุติธรรมอย่างแน่นอนหรือไม่? ถ้าเป็นเช่นนั้นทำไม คุณสามารถให้ทางเลือกซึ่งจะมีสมาชิกเพิ่มเติมจริง ๆ แล้วสมาชิก แต่จะไม่เกี่ยวข้องกับการพิมพ์หน้าจอทั้งหมดของเวกเตอร์อีกครั้งหรือไม่ ฉันสงสัยมัน แต่ถ้าคุณทำได้ฉันก็จะมีความสุข นอกจากนี้นอกเหนือจากความจริงที่ว่าคนงี่เง่าบางคนสามารถเขียนสิ่งที่ชอบ std::vector<int>* p = new MyVector มีอันตรายอื่นที่เหมือนจริงในการใช้ MyVector หรือไม่? โดยบอกว่าสมจริงฉันจะละทิ้งสิ่งต่าง ๆ อย่างเช่นจินตนาการถึงฟังก์ชั่นที่ใช้ตัวชี้ไปยังเวกเตอร์ ... ฉันได้กล่าวถึงกรณีของฉัน ฉันได้กระทำบาป. ตอนนี้ก็ขึ้นอยู่กับคุณที่จะให้อภัยฉันหรือไม่ :)
189 c++  oop  inheritance  stl  vector 

9
การสืบทอดรุ่น Maven โครงการ - ฉันต้องระบุเวอร์ชันหลักหรือไม่
ฉันมีสองโครงการ: โครงการหลัก: A, โครงการย่อย: B A / pom.xml: <groupId>com.dummy.bla</groupId> <artifactId>parent</artifactId> <version>0.1-SNAPSHOT</version> <packaging>pom</packaging> และใน B / pom.xml ฉันมี: <parent> <groupId>com.dummy.bla</groupId> <artifactId>parent</artifactId> <version>0.1-SNAPSHOT</version> </parent> <groupId>com.dummy.bla.sub</groupId> <artifactId>kid</artifactId> ฉันต้องการ B เพื่อสืบทอดรุ่นจากผู้ปกครองเพื่อให้เป็นสถานที่เดียวในกรณีของฉันฉันจำเป็นต้องใส่เป็น0.1-SNAPSHOT A/pom.xmlแต่ถ้าฉันลบออก<version>0.1-SNAPSHOT</version>จากB/pom.xmlภายใต้หัวข้อหลัก Maven บ่นเกี่ยวกับรุ่นที่ขาดหายไปสำหรับผู้ปกครอง มีวิธีที่ฉันสามารถใช้${project.version}หรืออะไรแบบนี้เพื่อหลีกเลี่ยงการมี01.-SNAPSHOTทั้งปอม?
189 inheritance  maven 

2
ทดสอบว่าคลาส Ruby เป็นคลาสย่อยของคลาสอื่นหรือไม่
ฉันต้องการทดสอบว่าคลาสสืบทอดจากคลาสอื่นหรือไม่ แต่ดูเหมือนว่าจะไม่มีวิธีสำหรับสิ่งนั้น class A end class B < A end B.is_a? A => false B.superclass == A => true การใช้งานเล็กน้อยของสิ่งที่ฉันต้องการจะเป็น: class Class def is_subclass_of?(clazz) return true if superclass == clazz return false if self == Object superclass.is_subclass_of?(clazz) end end แต่ฉันคาดหวังว่าสิ่งนี้จะมีอยู่แล้ว

11
แปลงรายการ <DerivedClass> เป็น List <BaseClass>
ในขณะที่เราสามารถสืบทอดจากคลาสพื้นฐาน / อินเทอร์เฟซทำไมเราไม่ประกาศList&lt;&gt; โดยใช้คลาส / อินเทอร์เฟซเดียวกัน interface A { } class B : A { } class C : B { } class Test { static void Main(string[] args) { A a = new C(); // OK List&lt;A&gt; listOfA = new List&lt;C&gt;(); // compiler Error } } มีวิธีแก้ไขไหม?

11
เหตุผลที่ดีที่จะห้ามการสืบทอดใน Java?
มีเหตุผลอะไรที่ดีที่จะห้ามการสืบทอดใน Java เช่นโดยใช้คลาสสุดท้ายหรือคลาสที่ใช้คอนสตรัคเตอร์แบบไม่มีพารามิเตอร์ตัวเดียว? อะไรคือเหตุผลที่ดีในการทำให้วิธีการเป็นที่สิ้นสุด?
178 java  inheritance  final 

8
ขยายคลาสข้อมูลใน Kotlin
คลาสข้อมูลดูเหมือนจะแทนที่ POJO ที่ล้าสมัยใน Java ค่อนข้างคาดหวังว่าคลาสเหล่านี้จะอนุญาตให้มีการสืบทอด แต่ฉันไม่เห็นวิธีที่สะดวกในการขยายคลาสข้อมูล สิ่งที่ฉันต้องการคือสิ่งนี้: open data class Resource (var id: Long = 0, var location: String = "") data class Book (var isbn: String) : Resource() รหัสข้างต้นล้มเหลวเนื่องจากการปะทะกันของcomponent1()วิธีการ การเพิ่มdataคำอธิบายประกอบทิ้งไว้ในคลาสใดคลาสหนึ่งเท่านั้นก็ไม่ทำงานเช่นกัน อาจมีสำนวนอื่นในการขยายคลาสข้อมูลหรือไม่ UPD: ฉันอาจใส่คำอธิบายประกอบเป็นคลาสย่อยของเด็กเท่านั้น แต่dataคำอธิบายประกอบจะจัดการกับคุณสมบัติที่ประกาศใน Constructor เท่านั้น นั่นคือฉันจะต้องประกาศคุณสมบัติของผู้ปกครองทั้งหมดopenและแทนที่พวกเขาซึ่งน่าเกลียด: open class Resource (open var id: Long = 0, open var location: …

6
การเรียกคลาสผู้ปกครอง __init__ ที่มีหลายมรดกวิธีที่ถูกต้องคืออะไร?
ว่าฉันมีสถานการณ์สืบทอดหลาย: class A(object): # code for A here class B(object): # code for B here class C(A, B): def __init__(self): # What's the right code to write here to ensure # A.__init__ and B.__init__ get called? มีสองวิธีทั่วไปเพื่อเขียนเป็นC's __init__: (แบบเก่า) ParentClass.__init__(self) (ใหม่สไตล์) super(DerivedClass, self).__init__() อย่างไรก็ตามในกรณีใดกรณีหนึ่งถ้าคลาสแม่ ( AและB) ไม่ปฏิบัติตามแบบแผนเดียวกันรหัสจะทำงานไม่ถูกต้อง (บางคนอาจพลาดหรือถูกเรียกหลายครั้ง) ดังนั้นวิธีที่ถูกต้องอีกครั้งคืออะไร? มันง่ายที่จะพูดว่า …

10
ใน Python ฉันจะระบุได้อย่างไรว่าฉันเอาชนะวิธีการได้?
ตัวอย่างเช่นใน Java @Overrideคำอธิบายประกอบไม่เพียง แต่ให้การตรวจสอบเวลาการคอมไพล์ของการแทนที่ แต่ยังสร้างรหัสการทำเอกสารด้วยตนเองที่ยอดเยี่ยม ฉันแค่มองหาเอกสาร (แม้ว่าจะเป็นตัวบ่งชี้ถึงตัวตรวจสอบบางอย่างเช่นไพลินต์นั่นเป็นโบนัส) ฉันสามารถเพิ่มความคิดเห็นหรือ docstring ที่ไหนสักแห่ง แต่วิธีการที่บ่งบอกถึงการแทนที่ใน Python คืออะไร?

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