ฉันต้องการทำสิ่งนี้:
List<Animal> animals = new ArrayList<Animal>();
for( Class c: list_of_all_classes_available_to_my_app() )
if (c is Animal)
animals.add( new c() );
ดังนั้นฉันต้องการดูคลาสทั้งหมดในแอปพลิเคชันจักรวาลของฉันและเมื่อฉันพบสิ่งที่สืบทอดมาจาก Animal ฉันต้องการสร้างวัตถุใหม่ของประเภทนั้นและเพิ่มลงในรายการ สิ่งนี้ทำให้ฉันสามารถเพิ่มฟังก์ชันการทำงานโดยไม่ต้องอัปเดตรายการสิ่งต่าง ๆ ฉันสามารถหลีกเลี่ยงสิ่งต่อไปนี้:
List<Animal> animals = new ArrayList<Animal>();
animals.add( new Dog() );
animals.add( new Cat() );
animals.add( new Donkey() );
...
ด้วยวิธีการข้างต้นฉันสามารถสร้างคลาสใหม่ที่ขยายขอบเขตสัตว์และมันจะถูกเลือกโดยอัตโนมัติ
ปรับปรุง: 10/16/2008 9:00 น. เวลามาตรฐานแปซิฟิก:
คำถามนี้ได้สร้างคำตอบที่ดีมากขอบคุณ จากคำตอบและการวิจัยของฉันฉันพบว่าสิ่งที่ฉันต้องการทำจริงๆนั้นเป็นไปไม่ได้ภายใต้ Java มีวิธีการเช่นกลไก ServiceLoader ของ ddimitrov ที่สามารถทำงานได้ - แต่มันหนักมากสำหรับสิ่งที่ฉันต้องการและฉันเชื่อว่าฉันเพียงแค่ย้ายปัญหาจากรหัส Java ไปยังไฟล์การกำหนดค่าภายนอก อัปเดต 5/10/19 (11 ปีต่อมา!) ตอนนี้มีห้องสมุดหลายแห่งที่สามารถช่วยเหลือสิ่งนี้ได้ตามคำตอบ org.reflectionsของ @ IvanNik ที่ดูดี นอกจากนี้ยังClassGraphจาก @Luke ฮัทชิสันคำตอบที่ดูน่าสนใจ มีความเป็นไปได้อีกมากมายในคำตอบเช่นกัน
อีกวิธีหนึ่งในการระบุสิ่งที่ฉันต้องการ: ฟังก์ชั่นคงที่ในคลาส Animal ของฉันค้นหาและสร้างคลาสทั้งหมดที่สืบทอดจาก Animal - โดยไม่ต้องมีการกำหนดค่า / การเข้ารหัสเพิ่มเติมใด ๆ ถ้าฉันต้องกำหนดค่าฉันก็อาจยกตัวอย่างพวกมันในคลาสสัตว์ต่อไป ฉันเข้าใจว่าเนื่องจากโปรแกรม Java เป็นเพียงการรวมกลุ่มของไฟล์. class ที่หลวม
ที่น่าสนใจดูเหมือนว่านี่เป็นเรื่องเล็กน้อยใน C #