คำถามติดแท็ก abstract-class

คลาสนามธรรมคือคลาสที่ไม่สามารถสร้างอินสแตนซ์ได้ มีไว้เพื่อจัดเตรียมฟังก์ชันการทำงานทั่วไปและข้อมูลจำเพาะของอินเทอร์เฟซสำหรับคลาสคอนกรีตหลายประเภท

11
ทำไมฟังก์ชั่นเสมือนล้วนเริ่มต้นด้วย 0
เรามักจะประกาศฟังก์ชั่นเสมือนที่บริสุทธิ์เป็น: virtual void fun () = 0 ; นั่นคือมันถูกกำหนดเป็น 0 เสมอ สิ่งที่ฉันเข้าใจคือนี่คือการเริ่มต้นรายการ vtable สำหรับฟังก์ชั่นนี้เป็นโมฆะและค่าอื่น ๆ ที่นี่ส่งผลให้เกิดข้อผิดพลาดในเวลารวบรวม ความเข้าใจนี้ถูกต้องหรือไม่?

6
การทดสอบคลาสนามธรรม
ฉันจะทดสอบวิธีที่เป็นรูปธรรมของคลาสนามธรรมด้วย PHPUnit ได้อย่างไร ฉันคาดหวังว่าฉันจะต้องสร้างวัตถุบางอย่างเป็นส่วนหนึ่งของการทดสอบ แม้ว่าฉันไม่ทราบวิธีปฏิบัติที่ดีที่สุดสำหรับสิ่งนี้หรือถ้า PHPUnit อนุญาตสำหรับสิ่งนี้

10
คลาสนามธรรมในภาษาสวิฟท์
มีวิธีในการสร้างคลาสนามธรรมในภาษา Swift หรือนี่เป็นข้อ จำกัด เช่นเดียวกับ Objective-C หรือไม่? ฉันต้องการสร้างคลาสนามธรรมเปรียบได้กับสิ่งที่ Java กำหนดเป็นคลาสนามธรรม

19
Visual Studio: ฉันจะแสดงคลาสทั้งหมดที่สืบทอดจากคลาสพื้นฐานได้อย่างไร
ใน Visual Studio ฉันจะแสดงคลาสทั้งหมดที่สืบทอดจากคลาสพื้นฐานได้อย่างไร ตัวอย่างเช่นใน ASP.NET MVC มีหลายประเภท ' ActionResult ' และพวกมันสืบทอดมาจาก / นำคลาสพื้นฐานActionResultมาใช้ ดูเหมือนว่าหากคุณเพิ่ง 'รู้' ViewและJsonเป็นActionResultประเภทที่ถูกต้องไม่มีวิธีที่คุณสามารถค้นหาข้อมูลนี้ได้อย่างง่ายดาย โปรดพิสูจน์ว่าฉันผิด มีบางสิ่งในเบราว์เซอร์วัตถุที่ทำให้ง่ายต่อการค้นหา ฉันยิ่งขอคำแนะนำเกี่ยวกับเครื่องมือที่อยู่นอก Visual Studio เพื่อค้นหาข้อมูลเกี่ยวกับคลาสต่างๆ ตัวอย่างเช่นมีบางสิ่งใน Resharper ที่จะช่วยฉันได้หรือไม่

3
C #: คลาสนามธรรมจำเป็นต้องใช้อินเทอร์เฟซหรือไม่?
รหัสทดสอบของฉันใน C #: namespace DSnA { public abstract class Test : IComparable { } } ผลลัพธ์ในข้อผิดพลาดของคอมไพเลอร์ต่อไปนี้: error CS0535: 'DSnA.Test' does not implement interface member 'System.IComparable.CompareTo(object)' เนื่องจากคลาสTestเป็นคลาสนามธรรมเหตุใดคอมไพเลอร์จึงกำหนดให้ใช้อินเทอร์เฟซ ข้อกำหนดนี้ไม่ควรบังคับสำหรับชั้นเรียนที่เป็นรูปธรรมเท่านั้นหรือ?



7
เหตุใดคลาสนามธรรมที่ใช้อินเทอร์เฟซจึงพลาดการประกาศ / การใช้งานวิธีใดวิธีหนึ่งของอินเทอร์เฟซ
สิ่งที่น่าสงสัยเกิดขึ้นใน Java เมื่อคุณใช้คลาสนามธรรมเพื่อใช้อินเทอร์เฟซ: วิธีการบางอย่างของอินเทอร์เฟซอาจหายไปโดยสิ้นเชิง (เช่นไม่มีการประกาศนามธรรมหรือการนำไปใช้จริง) แต่คอมไพเลอร์ไม่บ่น ตัวอย่างเช่นให้อินเทอร์เฟซ: public interface IAnything { void m1(); void m2(); void m3(); } คลาสนามธรรมต่อไปนี้ได้รับการรวบรวมอย่างสนุกสนานโดยไม่มีคำเตือนหรือข้อผิดพลาด: public abstract class AbstractThing implements IAnything { public void m1() {} public void m3() {} } คุณอธิบายได้ไหมว่าทำไม?


17
วิธีการใช้คลาสนามธรรมในทับทิม?
ฉันรู้ว่าไม่มีแนวคิดเรื่องชนชั้นนามธรรมในทับทิม แต่ถ้าจำเป็นต้องมีการดำเนินการจะดำเนินการอย่างไร? ฉันลองทำสิ่งที่ชอบ ... class A def self.new raise 'Doh! You are trying to write Java in Ruby!' end end class B < A ... ... end แต่เมื่อฉันพยายามสร้างอินสแตนซ์ B มันกำลังจะเรียกภายในA.newซึ่งจะเพิ่มข้อยกเว้น นอกจากนี้โมดูลไม่สามารถสร้างอินสแตนซ์ได้ แต่ไม่สามารถสืบทอดได้เช่นกัน การทำให้วิธีการใหม่เป็นแบบส่วนตัวจะไม่ได้ผลเช่นกัน คำแนะนำใด ๆ

3
วิธีสร้างคุณสมบัตินามธรรมในคลาสนามธรรมของ python
Baseในรหัสต่อไปนี้ฉันจะสร้างฐานระดับนามธรรม ฉันต้องการให้คลาสทั้งหมดที่สืบทอดมาBaseเพื่อจัดหาnameคุณสมบัติดังนั้นฉันจึงสร้างคุณสมบัตินี้เป็น@abstractmethod. จากนั้นฉันก็สร้างคลาสย่อยที่Baseเรียกว่าBase_1ซึ่งมีไว้เพื่อจัดหาฟังก์ชันการทำงานบางอย่าง แต่ยังคงเป็นนามธรรม ไม่มีnameคุณสมบัติในBase_1แต่อย่างไรก็ตาม python จะติดตั้งอ็อบเจ็กต์ของคลาสนั้นโดยไม่มีข้อผิดพลาด หนึ่งสร้างคุณสมบัติที่เป็นนามธรรมได้อย่างไร? from abc import ABCMeta, abstractmethod class Base(object): __metaclass__ = ABCMeta def __init__(self, strDirConfig): self.strDirConfig = strDirConfig @abstractmethod def _doStuff(self, signals): pass @property @abstractmethod def name(self): #this property will be supplied by the inheriting classes #individually pass class Base_1(Base): __metaclass__ = ABCMeta # …

10
สำนวน Pimpl เทียบกับอินเทอร์เฟซคลาสเสมือนจริง
ฉันสงสัยว่าอะไรจะทำให้โปรแกรมเมอร์เลือกสำนวน Pimpl หรือคลาสเสมือนจริงและการสืบทอด ฉันเข้าใจว่าสำนวน pimpl มาพร้อมกับการกำหนดทิศทางพิเศษที่ชัดเจนสำหรับแต่ละวิธีสาธารณะและค่าใช้จ่ายในการสร้างวัตถุ ในทางกลับกันคลาส Pure virtual มาพร้อมกับการกำหนดทิศทางโดยนัย (vtable) สำหรับการใช้งานที่สืบทอดมาและฉันเข้าใจว่าไม่มีค่าใช้จ่ายในการสร้างวัตถุ แก้ไข : แต่คุณต้องมีโรงงานถ้าคุณสร้างวัตถุจากภายนอก อะไรทำให้คลาสเสมือนจริงที่เป็นที่ต้องการน้อยกว่าสำนวน pimpl?

1
จะสร้างอินสแตนซ์ของคลาสนามธรรมที่ไม่ระบุชื่อใน Kotlin ได้อย่างไร
สมมติว่าKeyAdapterเป็นคลาสนามธรรมที่มีหลายวิธีที่สามารถลบล้างได้ ใน java ฉันสามารถทำได้: KeyListener keyListener = new KeyAdapter() { @Override public void keyPressed(KeyEvent keyEvent) { // ... } }; วิธีการทำเช่นเดียวกันใน Kotlin?

4
"staticmethod" และ "abc.abstractmethod`: จะผสมผสานกันหรือไม่?
ในแอพ Python ของฉันฉันต้องการสร้างเมธอดที่เป็นทั้ง a staticmethodและabc.abstractmethod. ฉันต้องทำอย่างไร ฉันลองใช้มัณฑนากรทั้งสอง แต่ไม่ได้ผล ถ้าฉันทำสิ่งนี้: import abc class C(object): __metaclass__ = abc.ABCMeta @abc.abstractmethod @staticmethod def my_function(): pass ฉันได้รับข้อยกเว้น * และถ้าฉันทำสิ่งนี้: class C(object): __metaclass__ = abc.ABCMeta @staticmethod @abc.abstractmethod def my_function(): pass ไม่มีการบังคับใช้วิธีนามธรรม ฉันจะสร้างวิธีการคงที่แบบนามธรรมได้อย่างไร * ข้อยกเว้น: File "c:\Python26\Lib\abc.py", line 29, in abstractmethod funcobj.__isabstractmethod__ = True AttributeError: 'staticmethod' object …

6
หลักการตั้งชื่อสำหรับคลาสนามธรรม
ฉันจำได้ชัดเจนว่าครั้งหนึ่งแนวทางที่ Microsoft ผลักดันคือการเพิ่มคำต่อท้าย "ฐาน" ในคลาสนามธรรมเพื่อขจัดความจริงที่ว่ามันเป็นนามธรรม ดังนั้นเราต้องเรียนเหมือนSystem.Web.Hosting.VirtualFileBase, System.Configuration.ConfigurationValidatorBase, และของหลักสูตรSystem.Windows.Forms.ButtonBaseSystem.Collections.CollectionBase แต่ฉันสังเกตเห็นว่าในช่วงปลายปีที่ผ่านมาคลาสนามธรรมจำนวนมากใน Framework ดูเหมือนจะไม่เป็นไปตามอนุสัญญานี้ ตัวอย่างเช่นคลาสต่อไปนี้ล้วนเป็นนามธรรม แต่ไม่เป็นไปตามหลักการนี้: System.DirectoryServices.ActiveDirectory.DirectoryServer System.Configuration.ConfigurationElement System.Drawing.Brush System.Windows.Forms.CommonDialog และนั่นเป็นเพียงสิ่งที่ฉันสามารถตีกลองได้ในไม่กี่วินาที ดังนั้นฉันจึงค้นหาสิ่งที่เอกสารทางการพูดเพื่อให้แน่ใจว่าฉันไม่ได้บ้า ผมพบว่ารายชื่อของการเรียน, Structs และการเชื่อมต่อใน MSDN ที่แนวทางการออกแบบเพื่อการพัฒนาห้องสมุด Class น่าแปลกที่ฉันไม่พบคำแนะนำในการเพิ่ม "ฐาน" ต่อท้ายชื่อคลาสนามธรรม และแนวทางดังกล่าวไม่มีให้ใช้งานสำหรับ Framework เวอร์ชัน 1.1 อีกต่อไป ฉันแพ้มันหรือเปล่า? เคยมีแนวทางนี้หรือไม่? เพิ่งถูกทิ้งโดยไม่มีคำพูด? ฉันสร้างชื่อชั้นยาว ๆ ด้วยตัวเองตลอดสองปีที่ผ่านมาเพื่ออะไร? มีคนโยนกระดูกให้ฉันที่นี่ อัพเดท ฉันไม่ได้บ้า แนวทางมีอยู่ Krzysztof Cwalina จับเรื่องนี้ในปี 2548

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