ความแตกต่างระดับคงที่และปิดผนึก


150
  1. มีคลาสใดบ้างที่ถูกนำไปใช้ในคลาสแบบสแตติก? วิธีการ:

    static class ABC : Anyclass
  2. มีคลาสใดที่สามารถสืบทอดได้ทั้งในคลาสที่ปิดผนึกและคลาสคงที่?
    วิธีการ:

    static class ABC : AClass {}

    และ

    sealed class ABC : AClass {}

ฉันขอผิดบ้างไหม?


staticไม่มีอะไรเกี่ยวข้องกับsealed
ken2k

1
แต่ @ ken2k คลาสสแตติกจะถูกปิดผนึกตามค่าเริ่มต้นใน C # ไม่ใช่เหรอ คลาสสแตติกไม่เข้าร่วมในการสืบทอดเลย
RBT

คำตอบ:


654

สิ่งนี้อาจช่วยคุณได้:

+--------------+---+-------------------------+------------------+---------------------+
|  Class Type  |   | Can inherit from others | Can be inherited | Can be instantiated | 
|--------------|---|-------------------------+------------------+---------------------+
| normal       | : |          YES            |        YES       |         YES         |
| abstract     | : |          YES            |        YES       |         NO          |
| sealed       | : |          YES            |        NO        |         YES         |
| static       | : |          NO             |        NO        |         NO          |
+--------------+---+-------------------------+------------------+---------------------+

1
น่ากลัว ขอบคุณสำหรับการตอบกลับที่พร้อมท์ @HosseinNarimaniRad ฉันยกระดับคุณในตอนเช้าเพราะข้อมูลถูกต้องแล้ว แต่มันก็เป็นเพียงปัญหาการจัดรูปแบบ Btw คำตอบของคุณควรจะเป็นคำตอบที่ได้รับการยอมรับจากช่วงเวลาที่โพสต์ แต่ดูเหมือนว่าเราจะต้องรออีกต่อไป :)
RBT

จัดเรียงได้น่าสนใจที่จะคิดประเภทอื่น ๆ ตามนี้ เช่นเดียวกับroot classที่สามารถสืบทอดและสร้างอินสแตนซ์ได้ แต่ไม่สามารถสืบทอดได้ ไม่แน่ใจว่าทำไมถึงมีประโยชน์ แต่ยังคง
AustinWBryan

static class Foo : object { }ถูกต้อง static class Foo { }แต่เป็นหลัก
themefield

39

ในคำง่าย ๆ

ระดับคงที่

ชั้นสามารถประกาศคงที่แสดงให้เห็นว่ามันมีสมาชิกคงที่เท่านั้น ไม่สามารถสร้างอินสแตนซ์ของคลาสแบบคงที่ได้โดยใช้คำหลักใหม่ คลาสที่คงที่จะถูกโหลดโดยอัตโนมัติโดย. NET Framework ภาษาทั่วไปรันไทม์ (CLR) เมื่อโปรแกรมหรือ namespace ที่มีการโหลดชั้นเรียน

คลาสที่ปิดผนึก

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


19

คุณสามารถปล่อยให้sealedสืบทอดชั้นจากชั้นอื่น แต่คุณไม่สามารถสืบทอดจากsealedระดับ:

sealed class MySealedClass : BaseClass // is ok
class MyOtherClass : MySealedClass     // won't compile

staticชั้นไม่สามารถรับมรดกจากชั้นเรียนอื่น ๆ


3

คุณสามารถแยกความแตกต่างของพวกเขาทั้งสองเป็น:

       Sealed Class       |        Static Class
--------------------------|-------------------------
it can inherit From other | it cannot inherit From other
classes but cannot be     | classes as well as cannot be
inherited                 | inherited

3

คำตอบง่ายๆคือคลาสที่ปิดผนึกไม่สามารถใช้เป็นคลาสพื้นฐานได้

ฉันกำลังพยายามแสดงให้คุณเห็นคลาสที่ปิดผนึกเป็นคลาสที่ได้รับในรหัสด้านล่าง

 public sealed class SealedClass : ClassBase
{
    public override void Print()
    {
        base.Print();
    }
}

และคุณลักษณะที่ปิดผนึกอื่นสามารถเข้าถึงได้ด้วยอินสแตนซ์จากมันเท่านั้น (คุณไม่สามารถสืบทอดจากมันได้)

 class Program
{
    static void Main(string[] args)
    {
        SealedClass objSeald = new SealedClass();
        objSeald.Name = "Blah blah balh";
        objSeald.Print();

    }
}

1

ชั้นเรียนที่ปิดสนิท:

  1. สามารถสร้างอินสแตนซ์ แต่ไม่สามารถสืบทอดได้
  2. สามารถมีสมาชิกแบบคงที่และแบบคงที่

คลาสแบบคงที่:

  1. ไม่สามารถสร้างอินสแตนซ์ของตนเองหรือรับช่วงต่อได้
  2. สามารถมีสมาชิกแบบสแตติกเท่านั้น

0

1 - ไม่คุณไม่สามารถใช้คลาสแบบคงที่ได้

2 - ไม่คุณไม่สามารถสืบทอดจากคลาสแบบสแตติกหรือแบบปิดผนึกได้


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