สิ่งที่ทำให้แตกต่างจากชั้นเรียนและในทางกลับกัน?
(ในความหมายทั่วไปผู้ไม่เชื่อเรื่องภาษา)
สิ่งที่ทำให้แตกต่างจากชั้นเรียนและในทางกลับกัน?
(ในความหมายทั่วไปผู้ไม่เชื่อเรื่องภาษา)
คำตอบ:
คำตอบต่อไปนี้มาจากหนังสือ Gof ( รูปแบบการออกแบบ )
คลาสของวัตถุกำหนดวิธีการนำวัตถุไปใช้คลาสจะกำหนดสถานะภายในของวัตถุและการใช้งานการดำเนินการ
ในทางกลับกันประเภทของวัตถุ จะอ้างถึงส่วนต่อประสานเท่านั้น - ชุดของคำขอที่สามารถตอบสนองได้
วัตถุสามารถมีได้หลายประเภทและวัตถุที่มีคลาสต่างกันสามารถมีชนิดเดียวกันได้
//example in c++
template<typename T>
const T & max(T const & a,T const &b)
{
return a>b?a:b; //> operator of the type is used for comparison
}
ฟังก์ชั่นสูงสุดต้องการประเภทที่มีการดำเนินงาน>ด้วยประเภทของตัวเองเป็นหนึ่งในนั้นอินเตอร์เฟซชั้นเรียนใด ๆ ที่ตอบสนองความต้องการข้างต้นสามารถนำมาใช้ในการสร้างฟังก์ชั่นสูงสุดเฉพาะสำหรับชั้นเรียนนั้น
ฉันมักจะนึกถึง 'ประเภท' เป็นคำศัพท์ใน 'คลาส' และ 'พื้นฐาน'
int foo; // Type is int, class is nonexistent.
MyClass foo; // Type is MyClass, class is MyClass
แรงบันดาลใจจากWikipedia ...
ในแง่ทฤษฎีประเภท
ประเภทเป็นอินเตอร์เฟซที่เป็นนามธรรม
ประเภทโดยทั่วไปเป็นตัวแทนของคำนามเช่นบุคคลสถานที่หรือสิ่งของหรือสิ่งที่ระบุชื่อ
ชั้นแสดงให้เห็นถึงการดำเนินงานของชนิด
มันเป็นโครงสร้างข้อมูลที่เป็นรูปธรรมและการรวบรวมรูทีนย่อย
คลาสคอนกรีตที่ต่างกันสามารถสร้างออบเจกต์ที่เป็นนามธรรมชนิดเดียวกัน (ขึ้นอยู่กับระบบของประเภท)
* ตัวอย่างหนึ่งอาจใช้ประเภทที่ Stack
มีสองคลาส : SmallStack
(เร็วสำหรับสแต็กขนาดเล็ก แต่ปรับขนาดได้ไม่ดี) และScalableStack
(ปรับขนาดได้ดี แต่ค่าใช้จ่ายสูงสำหรับสแต็กขนาดเล็ก) *
ในทำนองเดียวกันการเรียนได้รับอาจมีความแตกต่างกันหลายก่อสร้าง
ตัวอย่างกล้วย
Banana
ประเภทจะเป็นตัวแทนของคุณสมบัติและการทำงานของกล้วยทั่วไป
ABCBanana
และXYZBanana
ชั้นเรียนจะเป็นตัวแทนของวิธีการผลิตกล้วย
(ซัพพลายเออร์กล้วยที่แตกต่างกันในชีวิตจริงหรือโครงสร้างข้อมูลที่แตกต่างกันและฟังก์ชั่นเพื่อเป็นตัวแทนและวาดกล้วยในวิดีโอเกม)
ABCBanana
ระดับแล้วสามารถผลิตกล้วยโดยเฉพาะอย่างยิ่งที่มี อินสแตนซ์ของABCBanana
ระดับที่พวกเขาจะเป็นวัตถุของประเภทกล้วย
ไม่เป็นเรื่องยากที่โปรแกรมเมอร์จัดเตรียมการใช้งานแบบเดี่ยวและประเภทเดียว ในกรณีนี้ชั้นชื่อมักจะเป็นเหมือนกันกับชื่อประเภท แต่ยังคงมีประเภท (ซึ่งสามารถแยกได้ในอินเทอร์เฟซหากต้องการ) และการนำไปใช้ (ซึ่งจะใช้อินเทอร์เฟซแยกต่างหาก) ซึ่งสร้างอินสแตนซ์ (วัตถุ) ของคลาส
Type เป็นคำศัพท์ในร่มสำหรับเทมเพลตหรือแนวคิดของวัตถุที่มีอยู่ทั้งหมด คลาสเป็นเทมเพลตวัตถุหนึ่งรายการ ดังนั้นเป็นประเภทโครงสร้างประเภทจำนวนเต็มประเภทอินเตอร์เฟซ ฯลฯ ทุกประเภท
หากคุณต้องการคุณสามารถดูได้ด้วยวิธีนี้: ประเภทคือแนวคิดหลัก แนวคิดอื่น ๆ ทั้งหมด: คลาส, อินเตอร์เฟส, โครงสร้าง, จำนวนเต็ม ฯลฯ สืบทอดมาจากแนวคิดนี้พวกเขาเป็นประเภท
ประเภทมีคำอธิบายของข้อมูล (เช่นคุณสมบัติการดำเนินการ ฯลฯ )
Class เป็นชนิดเฉพาะ - เป็นแม่แบบในการสร้างอินสแตนซ์ของวัตถุวัตถุ
คลาสที่พูดอย่างเคร่งครัดเป็นแนวคิดพิเศษสามารถมองได้ว่าเป็นแพคเกจที่มีชุดย่อยของเมทาดาทาอธิบายบางแง่มุมของวัตถุ
ตัวอย่างเช่นใน C # คุณสามารถค้นหาอินเตอร์เฟสและคลาสได้ ทั้งคู่เป็นประเภท แต่อินเตอร์เฟสสามารถกำหนดสัญญาบางสัญญาเท่านั้นและไม่สามารถสร้างอินสแตนซ์ได้ซึ่งแตกต่างจากคลาส
คลาสที่พูดง่าย ๆคือชนิดพิเศษที่ใช้เพื่อห่อหุ้มคุณสมบัติและพฤติกรรมของวัตถุ
Wikipedia สามารถให้คำตอบที่สมบูรณ์ยิ่งขึ้นแก่คุณ:
เพื่อแสดงให้เห็นถึงวิธีที่เร็วที่สุด:
โครงสร้างเป็นชนิด แต่โครงสร้างไม่ได้เป็นคลาส
อย่างที่คุณเห็นประเภทเป็นคำที่ "เป็นนามธรรม" สำหรับคำจำกัดความของคลาสเท่านั้น แต่ยังมีโครงสร้างและชนิดข้อมูลดั้งเดิมเช่น float, int, bool
Type
(เป็นตัวพิมพ์ใหญ่ตามที่แสดง) เป็นชื่อย่อของคลาสระบบ ( System.Type
) ซึ่งใช้เพื่อเก็บคำอธิบายของประเภท
ประเภทคือแนวคิดของคลาส ในความหมายที่กว้างขึ้นคลาสเป็นรูปแบบหนึ่งประเภท
เกี่ยวข้องกับคลาสอย่างใกล้ชิดคือส่วนต่อประสานซึ่งสามารถมองว่าเป็นคลาสที่พิเศษมาก - เป็นนามธรรมที่บริสุทธิ์ เหล่านี้ก็เป็นประเภท
ดังนั้น "ประเภท" จึงครอบคลุมคลาสอินเทอร์เฟซและในภาษาส่วนใหญ่ด้วย นอกจากนี้แพลตฟอร์มอย่าง dot-net CLR ก็มีประเภทของโครงสร้างด้วยเช่นกัน
ในการเพิ่มอีกตัวอย่างของความแตกต่าง: ใน C ++ คุณมีตัวชี้และประเภทการอ้างอิงซึ่งสามารถอ้างถึงคลาส แต่ไม่ใช่คลาสในตัวมันเอง
Bar b; // b is of type "class Bar"
Bar *b2 = &b; // b2 is of type "pointer to Class Bar"
Bar &b3 = b; // b3 is of type "reference to Class Bar"
Bar *b4[7]; // b4 is of type "7-element array of pointers to Class Bar"
Bar ***b5; //b5 is of type "pointer to a pointer to a pointer to Class Bar"
โปรดทราบว่ามีเพียงคลาสเดียวที่เกี่ยวข้อง แต่สามารถใช้ชนิดจำนวนใกล้เคียงไม่ จำกัด ในบางภาษาฟังก์ชั่นจะถูกพิจารณาว่าเป็น "First-class-objects" ซึ่งในกรณีนี้ประเภทของฟังก์ชั่นจะเป็นคลาส ในคนอื่น ๆ ประเภทของฟังก์ชั่นเป็นเพียงตัวชี้ คลาสโดยทั่วไปมีแนวคิดของความสามารถในการเก็บข้อมูลตลอดจนการดำเนินการกับข้อมูลนั้น
ความคิดของฉันค่อนข้างสอดคล้องกับคำตอบของ aku
ฉันเห็นคลาสเป็นเทมเพลตสำหรับการสร้างวัตถุในขณะที่ประเภทเป็นวิธีการจัดประเภทวัตถุเหล่านั้นและให้อินเทอร์เฟซแก่พวกเขา
Python ยังเพิ่ม metaclasses ซึ่งเป็นเพียงกลไกในการสร้างคลาสในลักษณะเดียวกับคลาสที่สร้างออบเจ็กต์ (และทั้งคลาสและ metaclasses เป็นออบเจ็กต์ทั้งสอง)
การตอบสนองต่อคำถามเดียวกันใน lamba ที่ดีที่สุดดูเหมือนว่าฉันต้องการคำอธิบายที่สมบูรณ์แบบ
นำมาจากการอ้างอิงของ GoF จากด้านล่าง:
คลาสของวัตถุกำหนดวิธีการนำวัตถุไปใช้คลาสจะกำหนดสถานะภายในของวัตถุและการใช้งานการดำเนินการ
ในทางตรงกันข้ามประเภทของวัตถุ จะอ้างอิงถึงส่วนต่อประสาน - ชุดคำขอที่สามารถตอบสนองได้
ฉันต้องการให้ตัวอย่างโดยใช้ Java:
public interface IType {
}
public class A implements IType {
public A{};
}
public class B implements IType {
public B{};
}
ทั้งการเรียนA
และการใช้อินเตอร์เฟซและทำให้เป็นประเภทB
IType
นอกจากนี้ใน Java ทั้งสองคลาสจะสร้างชนิดของตัวเอง (ตามลำดับเป็นชื่อคลาส) ดังนั้นคลาสA
เป็นประเภทA
และ IType
คลาสB
มีประเภทB
และ IType
พอใจ:
วัตถุสามารถมีได้หลายประเภทและวัตถุที่มีคลาสต่างกันสามารถมีชนิดเดียวกันได้
ความแตกต่างระหว่างชนิดย่อยและคลาสย่อยอาจช่วยให้เข้าใจปัญหานั้นได้เช่นกัน:
https://www.cs.princeton.edu/courses/archive/fall98/cs441/mainus/node12.html
ฉันคิดว่าประเภทเป็นชุดของสิ่งที่คุณสามารถทำได้ด้วยค่าเฉพาะ ตัวอย่างเช่นหากคุณมีค่าจำนวนเต็มคุณสามารถเพิ่มลงในจำนวนเต็มอื่น ๆ (หรือดำเนินการทางคณิตศาสตร์อื่น ๆ ) หรือส่งผ่านไปยังฟังก์ชันที่ยอมรับอาร์กิวเมนต์จำนวนเต็ม หากคุณมีค่าวัตถุคุณสามารถเรียกวิธีการที่กำหนดโดยระดับของมัน
เนื่องจากคลาสจะกำหนดสิ่งที่คุณสามารถทำได้กับวัตถุของคลาสนั้นคลาสจึงกำหนดประเภท คลาสนั้นยิ่งกว่านั้นเนื่องจากยังให้คำอธิบายถึงวิธีการใช้งาน (สิ่งที่ไม่ได้บอกเป็นนัยถึงชนิด) และวิธีการจัดวางฟิลด์ของวัตถุ
โปรดทราบว่าค่าวัตถุสามารถมีได้เพียงหนึ่งคลาสเท่านั้น แต่อาจมีหลายประเภทเนื่องจากทุกคลาสซูเปอร์คลาสจะมีชุดย่อยของฟังก์ชันการทำงานที่มีอยู่ในคลาสของวัตถุ
ดังนั้นแม้ว่าวัตถุและประเภทจะมีความสัมพันธ์กันอย่างใกล้ชิด แต่ก็ไม่ได้เป็นสิ่งเดียวกัน
ประเภทใน C เช่น Int Float, char ฯลฯ กำหนดข้อมูลที่สามารถดำเนินการด้วยวิธีการเฉพาะที่สามารถทำงานกับพวกเขา มันไม่ซับซ้อนกว่านั้น เช่นเดียวกับ int ฉันสามารถเพิ่มลบคูณและหารด้วยก็ได้ นี่คือวิธีการของฉัน (หรือการดำเนินการ) สำหรับ int Class เป็นคำจำกัดความของประเภทใหม่ ฉันจะกำหนดว่าข้อมูลจะเป็นอย่างไร อาจจะเป็นบิตเดียว อาจเป็นคำสองคำที่ซับซ้อนเหมือนจริงและเป็นจินตภาพ หรือบางทีมันอาจจะซับซ้อนด้วยขนาด 309734325 ไบต์ที่แสดงถึงการแต่งหน้าปรมาณูของอนุภาคแปลก ๆ บนดาวพฤหัส ฉันไม่สนใจ เช่นเดียวกับจำนวนเต็มฉันได้ทำการดำเนินการที่ฉันสามารถทำได้กับชนิดข้อมูลใหม่นี้ ในกรณีของจำนวนเต็มที่ฉันเพิ่มลบ ฯลฯ ด้วยชนิดข้อมูลใหม่นี้ฉันสามารถกำหนดการดำเนินการใด ๆ ที่ฉันคิดว่าเหมาะสม พวกเขาอาจจะเพิ่มการลบ ฯลฯ แต่พวกเขาอาจเพิ่มสิ่งอื่น ๆ นี่คือวิธีการใด ๆ ที่ฉันตัดสินใจเพิ่มในชั้นเรียนของฉัน
บรรทัดล่างคือด้วยประเภทใน C คุณมีคำจำกัดความของข้อมูลคืออะไร; byte, word, float, char เป็นต้น แต่สิ่งเหล่านี้แสดงถึงการดำเนินงานที่ถูกกฎหมายและจะให้ผลลัพธ์ที่น่าเชื่อถือ
คลาสไม่แตกต่างกันยกเว้นคุณขึ้นอยู่กับการกำหนดอินเทอร์เฟซและการทำงานที่ยอมรับได้ คลาสจะกำหนดสิ่งเหล่านี้และเมื่อคุณสร้างอินสแตนซ์ในวัตถุมันจะกำหนดพฤติกรรมของวัตถุเช่นเดียวกับการกำหนดประเภทที่กำหนดพฤติกรรมของจำนวนเต็มเมื่อคุณดำเนินการกับมัน
ชั้นเรียนให้ความยืดหยุ่นแก่คุณในการกำหนดประเภทใหม่และทุกอย่างเกี่ยวกับวิธีการใช้งาน
เมื่อสิ่งนี้ถูกกำหนดทุกครั้งที่ฉันสร้างอินสแตนซ์ของคลาส "thingy" มันมีโครงสร้างข้อมูลที่ฉันกำหนดและการดำเนินการ (วิธีการ) ที่ฉันบอกว่าคุณสามารถทำได้ คลาส "thingy" เห็นได้ชัดว่าไม่มีอะไรมากไปกว่าประเภทใหม่ที่ C ++ ให้ฉันกำหนด
ประเภทโดยทั่วไปหมายถึงการจัดประเภทของค่าดั้งเดิม - จำนวนเต็ม, สตริง, อาร์เรย์, บูลีน, โมฆะ ฯลฯ โดยปกติคุณจะไม่สามารถสร้างประเภทใหม่ได้
ชั้นหมายถึงชุดของคุณสมบัติและเมธอดที่มีการเชื่อมโยงกับวัตถุเมื่อมันถูกสร้างขึ้น โดยปกติคุณสามารถกำหนดคลาสใหม่ได้มากเท่าที่คุณต้องการแม้ว่าบางภาษาคุณจะต้องสร้างวัตถุใหม่แล้วแนบวิธีการเข้าด้วยกัน
คำจำกัดความนี้ส่วนใหญ่เป็นความจริง แต่บางภาษาได้พยายามรวมประเภทและคลาสเข้าด้วยกันในรูปแบบต่างๆพร้อมกับผลลัพธ์ที่เป็นประโยชน์
ประเภทและคลาสมีความสัมพันธ์กัน แต่ไม่เหมือนกัน My take คือคลาสที่ใช้สำหรับการสืบทอดการใช้งานในขณะที่ชนิดจะถูกใช้สำหรับการทดแทนรันไทม์
นี่คือลิงค์อธิบายหลักการแทนที่และทำไม subclasses และ subtype ไม่เหมือนกันเสมอ (ใน Java เป็นตัวอย่าง) วิกิพีเดียหน้าแปรปรวนและ contravariance มีข้อมูลเพิ่มเติมเกี่ยวกับความแตกต่างนี้
ในภาษาไม่เชื่อเรื่องพระเจ้าทั่วไปรู้สึก - คลาสเป็นสำนึกของประเภท
บ่อยครั้งที่นี่เป็นเพียงการรับรู้ของประเภทนั้นคุณสามารถใช้คำทั้งสองเพื่ออ้างอิงในบางบริบท
ในทางตรงกันข้ามเช่นในบริบท C # - คลาสเป็นเพียงหนึ่งในการใช้งานอีกมากมาย ของแนวคิดประเภทเช่นดึกดำบรรพ์ structs พอยน์เตอร์ ฯลฯ
คำถามที่น่าสนใจ ฉันคิดว่าคำตอบของ aku นั้นตรงประเด็น ใช้ArrayList
คลาสjava เป็นตัวอย่าง
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
อินสแตนซ์ของArrayList
คลาสนั้นถูกกล่าวถึงว่าเป็นประเภทของทุก ๆ คลาสซูเปอร์ที่ขยายและทุกอินเตอร์เฟสที่ใช้ ดังนั้นอินสแตนซ์ของArrayList
คลาสจะมีประเภทArrayList
, RandomAccess
, Cloneable
และอื่น ๆ กล่าวอีกนัยหนึ่งค่า (หรืออินสแตนซ์) เป็นของประเภทหนึ่งประเภทขึ้นไปคลาสจะกำหนดประเภทเหล่านี้
คลาสที่ต่างกันอาจอธิบายชนิดเดียวกัน
ประเภทประกอบด้วยชิ้นส่วนเหล่านี้:
ชั้นประกอบด้วยชิ้นส่วนเหล่านี้:
หมายเหตุบางส่วน:
Interface (เช่นเดียวกับใน Java) ไม่ได้พิมพ์เพราะมันไม่ได้อธิบายความหมาย (อธิบายเพียงไวยากรณ์)
คลาสย่อยไม่ใช่ประเภทย่อยเนื่องจากคลาสย่อยอาจเปลี่ยนซีแมนทิกส์ที่กำหนดในซูเปอร์คลาสย่อยจึงไม่สามารถเปลี่ยนซีแมนทิกส์ซูเปอร์ไทป์ได้ (ดูหลักการการทดแทน Liskov เช่นตัวอย่าง LSP นี้ )
เห็นได้ชัดว่ามีภาษาที่มีระบบชนิดที่ไม่ใช่ภาษาการเขียนโปรแกรม OO ประเภทจะต้องเป็นแนวคิดที่กว้างกว่าชั้นเรียน
แม้แต่ในภาษาอย่าง Java int
ก็เป็นประเภท (ดั้งเดิม) แต่ไม่ใช่คลาส
ดังนั้น: ทุกชั้นเรียนเป็นประเภท แต่ไม่ใช่ทุกประเภทเป็นชั้นเรียน
หากเราคิดคำถามนี้ในบริบท C # เราจะไปถึงคำตอบที่ร้อง
ระบบประเภท C # แบ่งออกเป็นประเภทต่อไปนี้:
ประเภทค่า:
ประเภทอ้างอิง:
อย่างที่คุณเห็นมีหลายประเภทใน C # ซึ่ง Class เป็นเพียงประเภทเดียว มีหมายเหตุสำคัญเพียงข้อเดียวคือระบบชนิดของ C # นั้นรวมเป็นหนึ่งเดียวกันซึ่งค่าประเภทใด ๆ สามารถถือว่าเป็นวัตถุได้ ทุกประเภทใน C # โดยตรงหรือโดยอ้อมมาจากประเภทวัตถุคลาสและวัตถุเป็นชั้นฐานสุดท้ายของทุกประเภท ค่าของประเภทการอ้างอิงจะถือว่าเป็นวัตถุเพียงแค่ดูค่าเป็นวัตถุชนิด ค่าของประเภทค่าจะถือว่าเป็นวัตถุโดยดำเนินการการชกมวยและการเลิกทำกล่อง
อย่างที่ฉันเห็นพิมพ์เป็นร่มของหลาย ๆ อย่างที่ชั้นเรียนเป็นหนึ่งในนั้น
ผู้อ้างอิง: เอกสารข้อมูลภาษา CSahrp, หน้า 4
นี่เป็นคำถามที่ดีสำหรับฉันซึ่งทำให้ฉันคิดหนัก ฉันกล้าที่จะพูดว่า Class เป็นสิ่งคอมไพล์ไทม์และ Type เป็นสิ่งรันไทม์ ฉันพูดแบบนี้เพราะคุณเขียนชั้นเรียนไม่ได้ประเภท คอมไพเลอร์สร้างประเภทจากคลาสและรันไทม์ใช้ชนิดเพื่อสร้างอินสแตนซ์ของวัตถุ