การกำหนดคลาสนามธรรมโดยไม่มีวิธีนามธรรม


114

ฉันสามารถกำหนดคลาสนามธรรมโดยไม่ต้องเพิ่มวิธีนามธรรมได้หรือไม่?


1
เป็นตัวอย่างที่ดีสามารถพบได้ในมัณฑนากรรูปแบบให้ดูที่นี่ ทั้งสองWindowDecoratorและCoffeeDecoratorเป็นabstractคลาส แต่ไม่มีabstractวิธีการ
MS Dousti

คำตอบ:


168

แน่นอน.

การประกาศบทคัดย่อของคลาสหมายความว่าคุณไม่อนุญาตให้สร้างอินสแตนซ์ด้วยตัวเองเท่านั้น

การประกาศนามธรรมของวิธีการหมายความว่าคลาสย่อยต้องจัดเตรียมการนำไปใช้สำหรับวิธีการนั้น

ทั้งสองเป็นแนวคิดที่แยกจากกันแม้ว่าจะเห็นได้ชัดว่าคุณไม่มีวิธีการที่เป็นนามธรรมในชั้นเรียนที่ไม่ใช่นามธรรม คุณสามารถมีคลาสนามธรรมด้วยfinalวิธีการได้ แต่ไม่ต้องใช้วิธีอื่น


14

ใช่คุณสามารถทำได้ ทำไมคุณไม่ลองทำดูล่ะ?


6
และไม่ใช่แค่ OP ดูคะแนนโหวตทั้งหมดที่คำถามได้รับ!
Marc W

54
@ karim79 ไม่จำเป็นต้องมีม้าสูงและทุกสิ่งที่ราดซอส การลองใช้งานไม่ได้เปิดเผยว่าทำไมจึงได้รับอนุญาตในขณะที่ถามมัน
biziclop

7
@bizclop - การลองใช้ด้วยตัวเองอาจทำให้เกิดคำถามที่ได้ผลมากกว่า ไม่มีม้าสูง นี่ค่อนข้างตรงไปตรงมา คำถามของเขาคือ 'ฉันทำได้' แทนที่จะเป็น 'ทำไมถึงเป็นแบบนี้ ... '
karim79

8
หากสามารถตอบคำถามได้ง่ายๆด้วยใช่หรือไม่ใช่ผู้ถามควรพิจารณาเปลี่ยนวลีโดยใช้ Google หรือเพียงแค่ทดลองใช้
Tyler Treat

3
@ karim79 ใช่คำถามน่าจะใช้ประโยคได้ดีกว่านี้ แต่ฉันเดาว่าคงไม่ต้องใช้ความพยายามมากขนาดนั้นในการก้าวไปข้างหน้า
biziclop

8

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

ดังนั้นคุณสามารถกำหนดคลาสนามธรรมได้อย่างง่ายดายโดยไม่ต้องใช้วิธีนามธรรม

ตัวอย่างเช่น:

public abstract class AbstractClass{

    public String nonAbstractMethodOne(String param1,String param2){
        String param = param1 + param2;
        return param;
    }

    public static void nonAbstractMethodTwo(String param){
        System.out.println("Value of param is "+param);
    }
}

แค่นี้ก็เรียบร้อย


6

ใช่คุณสามารถสร้างคลาสนามธรรมโดยไม่ต้องใช้วิธีนามธรรมใด ๆ ตัวอย่างที่ดีที่สุดของคลาสนามธรรมโดยไม่มีวิธีนามธรรมคือ HttpServlet
Abstract Method เป็นวิธีการที่ไม่มีเนื้อความหากคุณประกาศอย่างน้อยหนึ่งวิธีในชั้นเรียนจะต้องประกาศคลาสนั้นเป็น บทคัดย่อมันบังคับ แต่ถ้าคุณประกาศคลาสนามธรรมมันไม่บังคับให้ประกาศวิธีนามธรรมในคลาส

คุณไม่สามารถสร้างวัตถุของคลาสนามธรรมซึ่งหมายความว่าไม่สามารถสร้างอินสแตนซ์ได้


4

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


คำถามไม่ได้เกี่ยวกับคลาสนามธรรมที่ว่างเปล่าเป็นเพียงคลาสนามธรรมที่ไม่มีวิธีนามธรรม ไม่มีเหตุผลที่ถูกต้องเท่าที่ฉันเห็นสำหรับการใช้คลาสนามธรรมที่ว่างเปล่าโดยสิ้นเชิง
biziclop

1
คำตอบคงที่ การใช้คลาสนามธรรมที่ว่างเปล่าอาจเป็นประโยชน์หากคุณมีเหตุผลที่ดีที่ต้องการเพิ่มวิธีการนามธรรมในภายหลังและไม่ต้องจัดการกับการปรับโครงสร้างคลาสแม่อื่น ๆ
Gordon Gustafson

1
ในช่วงกลางของลำดับชั้นคลาสนามธรรมที่ว่างเปล่าโดยสิ้นเชิง (ยกเว้นข้อมูลจำเพาะของการถ่ายทอดทางพันธุกรรม) อาจมีเหตุผลหากการสืบทอดของคลาสนั้นจะมีภาระผูกพันตามสัญญาที่แตกต่างจากของอนุพันธ์อื่น ๆ ของผู้ปกครอง
supercat

3

ใช่เราสามารถประกาศคลาสนามธรรมได้โดยไม่ต้องใช้วิธีนามธรรม จุดประสงค์ของการประกาศคลาสเป็นนามธรรมไม่ใช่เพื่อสร้างอินสแตนซ์ของคลาส

สองกรณี

1) คลาสนามธรรมด้วยวิธีนามธรรม

คลาสประเภทนี้เราต้องสืบทอดคลาสจากคลาสนามธรรมนี้และต้องแทนที่เมธอดนามธรรมในคลาสของเราเช่นคลาส GenricServlet

2) คลาสนามธรรมโดยไม่มีวิธีนามธรรม

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

โปรดตรวจสอบซอร์สโค้ด HttpServlet


2

ใช่เราสามารถมีคลาสนามธรรมได้โดยไม่ต้องใช้วิธีนามธรรมเนื่องจากทั้งสองเป็นแนวคิดอิสระ การประกาศคลาสนามธรรมหมายความว่าไม่สามารถสร้างอินสแตนซ์ได้ด้วยตัวเองและสามารถแบ่งได้เฉพาะคลาสย่อยเท่านั้น การประกาศ method abstract หมายความว่า Method จะถูกกำหนดไว้ใน subclass


เหตุใดฉันจึงไม่ต้องการให้ชั้นเรียนไม่สามารถสร้างอินสแตนซ์ได้ เหตุผลที่ดีเช่น?
karlihnos

1

ใช่คุณสามารถทำได้

การประกาศคลาสนามธรรมหมายความว่าคลาสจะไม่ถูกสร้างอินสแตนซ์โดยคลาสอื่น ๆ

และควรมีวิธีนามธรรมอย่างน้อยหนึ่งวิธีในนั้นและความหมายของวิธีนั้นคุณสามารถประกาศวิธีนามธรรมในชั้นเรียนนั้นได้หากคุณไม่ได้ประกาศวิธีการที่ดีกว่าวิธีที่ใช้ได้

ตัวอย่าง:

public abstract class abs {

    protected int cx = 0, cy = 0;

    public void p() {
        System.out.print("hello");
    }
}

สิ่งนี้จะได้ผลอย่างแน่นอน


1

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


1

ได้คุณสามารถกำหนดคลาสนามธรรมได้โดยไม่ต้องใช้วิธีนามธรรม อย่างไรก็ตามหากไม่มีวิธีการภายในคุณควรใช้อินเทอร์เฟซ


4
เป็นความคิดที่ดีสำหรับการ จำกัด จำนวนอักขระขั้นต่ำ 30 ตัว
Marc W

1
ถ้าไม่มีวิธีนามธรรมแล้วจะใช้อินเทอร์เฟซได้อย่างไร? อินเทอร์เฟซมีวิธีการทั้งหมดที่เป็นนามธรรมโดยค่าเริ่มต้น
Usman Rana

1

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

มรดกสำหรับฉันหมายถึงความสัมพันธ์ 'is-a' ลองนึกภาพคลาสสุนัขซึ่งสามารถขยายได้ตามประเภทย่อยที่เชี่ยวชาญกว่า (อัลเซเชี่ยนพุดเดิ้ล ฯลฯ ) ในกรณีนี้การทำให้คลาสสุนัขเป็นนามธรรมอาจเป็นสิ่งที่ถูกต้องเนื่องจากประเภทย่อยคือสุนัข ลองจินตนาการว่าสุนัขต้องมีปลอกคอ ในกรณีนี้การถ่ายทอดทางพันธุกรรมไม่สมเหตุสมผล: เป็นเรื่องไร้สาระที่จะมีความสัมพันธ์แบบ 'is-a' ระหว่างสุนัขและปลอกคอ นี่คือความสัมพันธ์แบบ 'has-a' อย่างแน่นอนปลอกคอเป็นวัตถุที่ทำงานร่วมกัน การทำปกเป็นนามธรรมเพื่อให้สุนัขสามารถมีได้นั้นไม่สมเหตุสมผล

ฉันมักจะพบว่าคลาสนามธรรมที่ไม่มีวิธีการทางนามธรรมนั้นแสดงออกถึงความสัมพันธ์แบบ 'has-a' จริงๆ ในกรณีเหล่านี้ฉันมักจะพบว่ารหัสสามารถแยกตัวประกอบได้ดีกว่าโดยไม่ต้องใช้การสืบทอด ฉันยังพบว่าคลาสนามธรรมที่ไม่มีวิธีนามธรรมมักจะเป็นกลิ่นรหัสและอย่างน้อยที่สุดก็ควรนำไปสู่คำถามที่เกิดขึ้นในการทบทวนโค้ด

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


1

จริงๆแล้วไม่มีความหมายถ้าคลาสนามธรรมไม่มีวิธีนามธรรม ชนชั้นนามธรรมเปรียบเสมือนพ่อ พ่อคนนี้มีคุณสมบัติและพฤติกรรมบางอย่างเมื่อคุณเป็นเด็กอยากเป็นลูกของพ่อพ่อบอกว่าลูก (คุณ) ต้องเป็นแบบนี้มันคือ MOTO ของเราและถ้าคุณไม่อยากทำคุณ ไม่ใช่ลูกของฉัน

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