ประเภทการดำรงอยู่แตกต่างจากอินเตอร์เฟสได้อย่างไร


11

กำหนดประเภทการดำรงอยู่

T = X.{op₁:X, op₂:Xboolean}

และอินเตอร์เฟส Java ทั่วไปนี้:

interface T<X> {
    X op₁();
    boolean op₂(X something);
}

อะไรคือความแตกต่างพื้นฐานระหว่างประเภทที่มีอยู่และส่วนต่อประสาน Java?

เห็นได้ชัดว่ามีความแตกต่างทางไวยากรณ์และการวางแนววัตถุของ Java (ซึ่งรวมถึงรายละเอียดเช่นthisพารามิเตอร์ที่ซ่อนอยู่ฯลฯ ) ฉันไม่ได้สนใจสิ่งเหล่านี้มากนักในความแตกต่างทางความคิดและความหมาย - แม้ว่าบางคนอยากจะแสดงความเห็นในบางประเด็นที่ละเอียดกว่า (เช่นความแตกต่างระหว่างตัวละครTกับT<X>) ที่จะได้รับการชื่นชมเช่นกัน


คำตอบ:


4

อืม ... คำจำกัดความนั้นดูคล้ายกับตัวอย่างของฮาเซลบางอย่างที่ข้าเคยเห็นมานานแล้ว

{-# LANGUAGE ExistentialQuantification #-}
data X = forall a . X { value :: a, viewValue :: a -> String }
instance Show X where show (X { value = x, viewValue = f}) = f x
sample :: [X]
sample = [X 3 show, X "abc" show, X 3.14 show]

เมื่อตัวสร้างXถูกนำไปใช้∀จริงกลายเป็น∃ โปรดทราบว่าเมื่อคุณนำออกvalueคุณไม่ทราบประเภทและมีชุดของการดำเนินการที่ว่างเปล่า แต่เนื่องจากviewValueมีความสอดคล้องกันกับvalueมันจึงสามารถใช้กับมันได้

ผมคิดว่าแตกต่างหลักของ Java interfaceที่คุณนำเสนอเป็นความจริงที่คุณต้องรู้ประเภทสื่อกลางสำหรับการส่งผ่านผลมาจากการop₁ op₂คือระบบที่เหมาะสมสำหรับประเภทที่มีอยู่ควรเลือกประเภทที่เหมาะสมซึ่งรับประกันว่าจะมีอยู่ตามเงื่อนไข ∀X. X→(X→boolean)→Tคือคุณควรจะสามารถที่จะเขียนฟังก์ชั่นที่มีประเภท: ในตัวอย่างก่อนหน้าฟังก์ชั่นดังกล่าวเป็นตัวXสร้างที่ใช้ในX 3 show( showเป็นฟังก์ชั่นที่จะโต้แย้งประเภทใด ๆ ที่ดำเนินการShowและผลตอบแทนString)

อัปเดต:ฉันเพิ่งอ่านคำถามของคุณอีกครั้งและฉันคิดว่าฉันมีโครงสร้างที่เหมาะสมสำหรับ Java:

interface T {
    boolean op₂();
}
...
T x = new T() {
    private final int op = ...;
    public boolean op₂() { return ((op % 2) == 0); }
};
T y = new T() {
    private final char op = ...;
    public boolean op₂() { return ('0' <= op && op <= '9'); }
};
if (x.op₂() && y.op₂()) ...

คุณพูดถูกแล้วthis- มันคือ opap ของคุณ

ดังนั้นฉันเดาว่าตอนนี้ฉันเข้าใจแล้วว่าภาษา OOP แบบคลาสสิก (Java, C #, C ++ ฯลฯ ) มักจะใช้ประเภทอัตถิภาวนิยมด้วยค่าเดียวthisและฟังก์ชั่นที่เรียกว่า "เมธอด" ซึ่งเรียกว่าโดยนัย

ป.ล. ขออภัยฉันไม่คุ้นเคยกับ Java มาก แต่หวังว่าคุณจะมีความคิด


ฉันจะเพิ่มสิ่งนี้ที่คุณต้องการดูประเภท Single Abstract Method (SAM) ที่มีการแนะนำใน Java 8 สำหรับการสนับสนุนการเขียนโปรแกรมการทำงาน
Martijn Verburg

2

ข้อแตกต่างคืออินเทอร์เฟซ Java หมายถึงบางสิ่งบางอย่างกับคอมไพเลอร์ Java

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


Nope cf william ทำอาหารกระดาษ
ลัส

2

รูปแบบการนำเสนอทั้ง 2 ประเภทนั้นแตกต่างกันมาก คำจำกัดความอินเทอร์เฟซที่คุณเขียนเป็นประเภทสากล (generics Java โดยทั่วไปอยู่ในหมวดหมู่นี้)

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

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

ไม่มีอยู่จริงใน Java เป็นโครงสร้างภาษายกเว้นในกรณีที่ จำกัด ของสัญลักษณ์ตัวแทน ( List<?>) แต่ใช่พวกเขาสามารถเลียนแบบด้วยอินเตอร์เฟส ปัญหาจะกลายเป็นเรื่องของการออกแบบมากขึ้น

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

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