เหตุใด C # จึงอนุญาตคุณสมบัติในส่วนต่อประสาน


47

ใน C # รหัสต่อไปนี้ถูกต้อง

interface I{
    int property{get;set;}
}

ซึ่งไม่สมเหตุสมผลเลยสำหรับฉัน สิ่งนี้ดูเหมือนจะทำลายหนึ่งในหลักการที่สำคัญที่สุดของอินเทอร์เฟซ: ขาดสถานะ (กล่าวอีกนัยหนึ่งไม่มีฟิลด์) สถานที่ให้บริการไม่ได้สร้างเขตข้อมูลส่วนตัวโดยนัย? นั่นจะไม่เลวสำหรับอินเทอร์เฟซหรือไม่


12
การขาดสถานะเป็นหนึ่งในหลักการของการใช้อินเตอร์เฟสหรือไม่ สำหรับฉันอินเทอร์เฟซเป็นวิธีการกำหนดสัญญาเช่นถ้าคลาสใช้อินเทอร์เฟซเช่นนั้นมันมีวิธีการและคุณสมบัติทั้งหมดที่กำหนดไว้ในสัญญา
Florian Margaine

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

1
@ FlorianMargaine แน่นอนแนวคิดของสัญญาเป็นหลักการที่สำคัญที่สุดของอินเทอร์เฟซ แต่ขาดสถานะก็มีความสำคัญเช่นกัน สิ่งนี้ช่วยแยกมันออกจากคลาสนามธรรม IE ใน Java 8 สิ่งนี้กลายเป็นความแตกต่างที่สำคัญระหว่างอินเตอร์เฟสและคลาสนามธรรม
Reinstate Monica


2
@Doval: มันเป็นเรื่องธรรมดาที่อินเทอร์เฟซประกาศวิธีการดังกล่าว แต่ไม่ว่าจะใช้พวกเขา
จอร์โจ

คำตอบ:


65

ฉันคิดว่าส่วนที่สับสนคือถ้าคุณเขียนint Property { get; set; }ในชั้นเรียนแล้วมันเป็นคุณสมบัติอัตโนมัติพร้อมเขตข้อมูลสำรองโดยปริยาย

แต่ถ้าคุณเขียนสิ่งเดียวกันในอินเทอร์เฟซมันไม่ใช่คุณสมบัติอัตโนมัติมันเพิ่งประกาศว่าคุณสมบัตินั้นเป็นส่วนหนึ่งของอินเทอร์เฟซและประเภทใด ๆ ที่ใช้อินเทอร์เฟซนั้นต้องมีคุณสมบัตินั้น (เป็นคุณสมบัติอัตโนมัติหรือไม่ ) แต่มันไม่ได้สร้างเขตข้อมูลสำรอง

วิธีหนึ่งที่จะเห็นความแตกต่างคือการเขียนint Property { get; }: สิ่งนี้ใช้ได้ในอินเตอร์เฟสและประกาศคุณสมบัติที่มีเพียงตัวรับ แต่ไม่มีตัวตั้งค่า แต่มันจะไม่รวบรวมในชั้นเรียน (เว้นแต่ว่าคุณกำลังใช้ C # 6.0) เนื่องจากคุณสมบัติอัตโนมัติจะต้องมี setter


18

การกำหนดคุณสมบัติที่คุณได้แสดงให้เห็นเป็นเช่นเดียวกับการกำหนดวิธีการและint GetProperty() void SetProperty(int i)คุณสมบัติมีประสิทธิภาพในระยะสั้นใน C #

คุณสมบัติไม่ได้สร้างเขตข้อมูลส่วนตัวใน C # นั่นคือการใช้งานเริ่มต้นของauto-propertyตัวอย่างเช่นpublic string MyString { get; set;}อย่างไรก็ตามคุณสมบัติที่กำหนดตรรกะที่กำหนดเองในgetวิธีการนี้จะไม่สร้างเขตข้อมูลส่วนตัวโดยนัย

ท้ายสุดเมื่ออินเตอร์เฟสเกี่ยวข้องกับpublic API จะเกิดอะไรขึ้นถ้าการใช้งานคุณสมบัติอินเตอร์เฟสอาศัยฟิลด์ส่วนตัวโดยปริยายหรืออย่างอื่น? ที่ถูกซ่อนจากผู้บริโภคของอินเทอร์เฟซโดยไม่คำนึงถึง


อ่า ... ฉันไม่ได้ตระหนักว่ามันจะเกิดขึ้นเฉพาะกับคุณสมบัติรถยนต์และเนื่องจากคุณต้องแทนที่มัน แต่ถ้าอินเทอร์เฟซคือการสร้างตัวแปรส่วนตัวภายในผู้ใช้จะไม่สามารถเข้าถึงมัน - ปัญหาชัดเจน
Reinstate Monica

9
หากคุณกำหนดคุณสมบัติในอินเตอร์เฟส C # การใช้งานคุณสมบัตินั้นจะถูกทิ้งไว้ที่คลาสการนำไปใช้ซึ่งสามารถทำให้คุณสมบัติเป็นแบบอัตโนมัติหรือกำหนดตรรกะแบบกำหนดเองตามที่เห็นสมควร ข้อมูลไม่ถูกเพิ่มลงในอินเตอร์เฟซ
NWard

10

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


บางครั้งจะไม่มีเขตข้อมูลสำรอง แม้ว่ามันจะเป็นเรื่องยากที่จะกำหนดทั้งการรับและการตั้งค่าและไม่มีเขตข้อมูลสำรองสำหรับมัน
Stephen

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

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