ฉันสามารถพิจารณาวิธีการเชื่อมต่อเป็นวิธีนามธรรมได้หรือไม่


15

ฉันกำลังคิดเกี่ยวกับสิ่งนั้นและฉันมีข้อสงสัย

เมื่อฉันประกาศอินเทอร์เฟซตัวอย่างเช่น:

public interface MyInterface
{
   public void method1();
   public void method2();
}

วิธีการอินเตอร์เฟสเหล่านี้ถือเป็นนามธรรมหรือไม่ สิ่งที่ฉันหมายถึงคือแนวคิดของวิธีนามธรรมคือ:

วิธีนามธรรมเป็นวิธีการที่ประกาศ แต่ไม่มีการใช้งาน

ดังนั้นวิธีการเหล่านี้ถือว่าเป็นนามธรรมหรือไม่ พวกเขาไม่ใช่วิธีนามธรรมที่ "บริสุทธิ์" เนื่องจากฉันไม่ได้ใช้abstractคำ แต่แนวคิด แต่ดูเหมือนว่าพวกเขาเป็น

คุณบอกอะไรฉันได้บ้าง

ขอบคุณ


น่าจะดีที่สุดใน SO
billy.bob

5
@ billy.bob - ฉันคิดว่ามันเป็นนามธรรมเกินไปสำหรับ Stack Overflow ไม่มีปัญหาการเข้ารหัสเฉพาะที่นี่
ChrisF

รหัส Java นี้หรือไม่
Andres F.

ไม่มันไม่ใช่. มันเป็นเพียงตัวอย่าง คำถามไม่ได้เน้นที่ภาษาการเขียนโปรแกรมใด ๆ
rogcg

คำตอบ:


14

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

สำหรับอินเทอร์เฟซเนื่องจากไม่มีการใช้งานเลยพวกมันมีประโยชน์สำหรับจุดประสงค์: สัญญา หากคุณใช้งานอินเตอร์เฟสคุณต้อง  ใช้วิธีการต่าง ๆ ในส่วนต่อประสาน

ดังนั้นความแตกต่างคือคลาสนามธรรมสามารถใช้วิธีการในขณะที่อินเตอร์เฟซไม่สามารถ

เหตุผลที่แยกจากกันคือคลาสสามารถใช้หลายอินเตอร์เฟส Java และ C # จำกัด คลาสให้เป็นคลาสที่สืบทอดจากคลาสพาเรนต์เดียว บางภาษาอนุญาตให้คุณสืบทอดจากหลายคลาสและคุณสามารถทำงานของอินเทอร์เฟซได้ผ่านคลาสนามธรรม "ล้วนๆ" แต่การรับมรดกหลายครั้งมีปัญหาคือปัญหาเพชรที่หวั่นไหว


+1 สำหรับการรวมความแตกต่างระหว่างการสืบทอดคลาสนามธรรมและการนำไปใช้งานของหนึ่งอินเตอร์เฟสขึ้นไป

ปัญหาเพชรเป็นความขัดแย้งที่น่ากลัว
rogcg

1
ฉันไม่เห็นด้วยกับ 'อินเทอร์เฟซเหมือนกับส่วน "นามธรรมแท้" คลาส " พวกเขาเป็น 'หน่วยการสร้าง' 2 ประเภทที่แตกต่างกันของ OO ดังนั้นพวกเขาจึงไม่เหมือนกันเลย พวกเขาแบ่งปันคุณสมบัติทั่วไปบางประการ แต่โดยธรรมชาติแล้วพวกเขาเป็นคนละประเภทกันมากขึ้นเช่นผู้ชายและผู้หญิง :)
NoChance

5
@Emmand Kareem ฉันไม่เห็นด้วยกับ 'อินเทอร์เฟซเหมือนส่วน "หมดจด" ระดับนามธรรม' นั่นเป็นเหตุผลที่ฉันเขียนมัน :-) หากคุณมีเหตุผลที่ดีสำหรับความไม่เห็นด้วยกรุณาโพสต์รหัสชอบฟัง
coder

เป็นที่น่าสังเกตว่า c # 8 ยังนำเสนอแนวคิดของการใช้อินเทอร์เฟซเริ่มต้น
John Wu

11

ฉันพบคำตอบที่เป็นประโยชน์ที่นี่: http://download.oracle.com/javase/tutorial/java/IandI/abstract.html

วิธีการทั้งหมดในอินเทอร์เฟซนั้นเป็นนามธรรมโดยปริยายดังนั้นตัวดัดแปลงแบบนามธรรมจึงไม่ได้ใช้กับวิธีการอินเทอร์เฟซ


1
โปรดสังเกตว่าคลาสนามธรรมจะขยายวัตถุอีกอันหนึ่ง อินเทอร์เฟซไม่มีแนวคิดของซูเปอร์คลาส

2
นอกจากนี้โปรดทราบว่าคุณสามารถใช้หลายอินเตอร์เฟส แต่คุณสามารถสืบทอดจากคลาสที่เป็นนามธรรมหรือไม่เท่านั้น
NullUserException

@ ThorbjørnRavnAndersen: อินเทอร์เฟซสามารถขยายหนึ่งอินเตอร์เฟสขึ้นไป มันไม่ใช่สิ่งเดียวกันกับชั้นยอด แต่เป็นระดับของการสืบทอด
unholysampler

คุณสามารถใช้หลายอินเตอร์เฟส ดูเหมือนว่าแนวคิดของการสืบทอดหลายอย่าง แต่ไม่เหมือนกันทั้งหมด
rogcg

@unholysampler ซึ่งไม่ใช่ซุปเปอร์คลาส - อย่างที่ฉันบอก

4

คลาสนามธรรมสามารถมีวิธีนามธรรม

การเชื่อมต่อสามารถมีวิธีนามธรรมเท่านั้น

method1()และmethod2()ในตัวอย่างของคุณเป็นวิธีนามธรรม


-1

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


8
วิธีการบทคัดย่อไม่สามารถมีรายละเอียดการใช้งาน คลาสนามธรรมสามารถ
Matt H

ฉันรู้ความแตกต่างระหว่างวิธีการและชั้นเรียน - แต่ฉันไม่เข้าใจจุดที่คุณกำลังทำ?
billy.bob

คำตอบของคุณระบุว่าวิธีการแบบนามธรรมสามารถมีรายละเอียดการใช้งานได้ซึ่งไม่สามารถทำได้ แค่พิมพ์ผิดหรือเปล่า?
Matt H

1
ฉันพิมพ์ผิด
Martijn Verburg

1
@ billy.bob คำถามนี้เกี่ยวกับวิธีการเลิกคิดว่า
SoylentGray

-2

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


-3

คลาสอินเทอร์เฟซไม่มีวิธีนามธรรม พวกเขาไม่มีวิธีการใด ๆ เลย พวกเขามีรายการวิธีการที่คลาสอื่นจะต้องดำเนินการเพื่อให้สอดคล้องกับอินเตอร์เฟส ในตัวอย่างของคุณไม่มีเมธอดเมธอด 1 และเมธอดเมธอด 2 จนกว่ามีบางคนเพิ่มเมธอดเหล่านี้เข้ากับคลาส

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