ข้อมูลเบื้องต้นเกี่ยวกับการสืบทอดข้ามภาษาใน .NET
การเปิดตัว .NET ทำให้การพัฒนาภาษาง่ายกว่าที่เคย เราไม่จำเป็นต้องกังวลเกี่ยวกับการใช้ ATL wrapper ในภาษา C++ เพื่อเข้าถึงส่วนประกอบ VB อีกต่อไป หรือเรียกแบบแผนเมื่อพยายามเชื่อมต่อกับโค้ด FORTRAN ขณะนี้ภาษาที่เปิดใช้งาน .NET ทั้งหมดเป็นเอนทิตีชั้นหนึ่งและทำงานร่วมกันได้อย่างราบรื่น ช่วยให้ระบบที่แตกต่างกันสามารถทำงานร่วมกันได้ง่ายกว่าที่เคย และยังช่วยให้นักพัฒนาที่มีชุดทักษะที่แตกต่างกันสามารถทำงานร่วมกันในโครงการได้อย่างกลมกลืน
การสร้างส่วนประกอบในภาษาหนึ่งซึ่งอีกภาษาหนึ่งสามารถใช้ได้นั้นทำได้ง่ายมาก ใช้ Visual Studio.NET Wizard เพื่อสร้างไลบรารีคลาสในภาษา .NET ที่คุณชื่นชอบ คอมไพล์ เท่านี้คุณก็เสร็จแล้ว
ตัวอย่างเช่น เราจะสร้างคลาสอย่างง่ายใน C# ที่แสดงสองวิธี:
namespace MyCSClass
{
using System;
public class CSClass
{
public CSClass () { }
// returns the length of the passed string
public int MyMethod (string str)
{
return str. Length ;
}
// returns n squared
virtual public int MyVirtualMethod ( int n)
{
return n*n;
}
}
}
วิธีแรก MyMethod
รับวัตถุสตริงและส่งกลับความยาว วิธีที่สองเป็นแบบเสมือน และส่งกลับค่ากำลังสองของตัวเลขที่ส่งเข้ามา สมมติว่าเราได้คอมไพล์คอมโพเนนต์นี้เป็น MyCSClass.dll
หากต้องการใช้ส่วนประกอบนี้โดยใช้ C++ ที่มีการจัดการ เราจำเป็นต้องนำเข้าแอสเซมบลีลงในโปรแกรมของเราก่อน:
# using " MyCSClass.dll "
แค่นั้นแหละ. ไม่มี typelibs ไม่มีไฟล์ .def ไม่มีส่วนหัว ATL เราเพียงใช้คำสั่ง #using
(และให้แน่ใจว่า dll อยู่ในเส้นทางการค้นหาของคอมไพเลอร์) และปล่อยให้คอมไพเลอร์จัดการส่วนที่เหลือ
เมื่อเรานำเข้าคลาสแล้ว เราสามารถใช้การประกาศ using
เพื่อบันทึกการพิมพ์:
using namespace MyCSClass ;
สังเกตความแตกต่างที่นี่: #using
สำหรับการนำเข้าแอสเซมบลีในโครงการของคุณ using
ระบุเนมสเปซที่เราจะใช้งานและบันทึกการพิมพ์เท่านั้น
ที่จริงแล้วการใช้คลาสนั้นเหมือนกับการใช้ประเภทการอ้างอิงที่มีการจัดการอื่น ๆ ใน .NET:
CSClass *cs = new CSClass();
int result;
result = cs-> MyMethod ( " Hello World " ); // will return 11
result = cs-> MyVirtualMethod ( 2 ); // will return 2 squared
การทำงานร่วมกันข้ามภาษาเป็นไปไกลกว่าแค่ทำให้การใช้ส่วนประกอบที่เขียนในภาษาต่างๆ ง่ายขึ้น นอกจากนี้เรายังสามารถสืบทอดคลาสใหม่จากส่วนประกอบที่เขียนในภาษาอื่น โดยไม่จำเป็นต้องใช้ซอร์สโค้ดดั้งเดิมสำหรับส่วนประกอบ
ลองนึกภาพคุณได้ซื้อหรือได้รับส่วนประกอบสุดเจ๋งที่คุณชอบใช้ แต่คุณอยากได้คุณสมบัติเพิ่มเติมสักหนึ่งหรือสองอย่าง หรือว่ามันมีบางอย่างที่แตกต่างออกไปเล็กน้อย ใน .NET คุณสามารถสืบทอดคลาสใหม่จากส่วนประกอบนั้นเพื่อสร้างส่วนประกอบใหม่ที่ทำงานได้อย่างที่คุณต้องการ คุณไม่ได้สร้าง wrapper สำหรับส่วนประกอบ: คุณกำลังสร้างส่วนประกอบใหม่ที่ได้รับคุณสมบัติ วิธีการ และฟิลด์ และสามารถแทนที่วิธีการเสมือนของส่วนประกอบเก่าและเพิ่มวิธีการใหม่ได้
กลับไปที่ตัวอย่างของเรา วิธีการ CSClass::MyVirtualMethod
เป็นเสมือน ดังนั้นเรามาประกาศคลาส C++ ใหม่ที่ได้มาจากคลาส C# นี้ และแทนที่วิธีการเสมือนนั้น
__gc class CPPClass : public MyCSClass ::CSClass
{
public:
// returns the cube of the given number
virtual int MyVirtualMethod ( int n)
{
return n*n*n;
}
};
เราได้แทนที่ CSClass::MyVirtualMethod
ด้วยเมธอดใหม่ของเราที่ส่งคืนคิวบ์ ไม่ใช่กำลังสอง ของตัวเลขที่กำหนด เมื่อเราคอมไพล์โค้ดแล้ว เราก็มีส่วนประกอบ C++ ใหม่ที่แทนที่เมธอดเสมือนในคลาส C# และยังมีฟังก์ชัน MyMethod()
ที่ไม่ใช่เสมือนอีกด้วย
CPPClass *cpp = new CPPClass();
int result;
result = cpp-> MyMethod ( " Hello World " ); // will return 11
result = cpp-> MyVirtualMethod ( 2 ); // Will output 2 cubed, not 2 squared
การดาวน์โหลดที่มาพร้อมกับบทความนี้ประกอบด้วยคอมโพเนนต์ C# และ VB.NET ที่ใช้และสืบทอดโดยคอมโพเนนต์ C++
การทำงานร่วมกันข้ามภาษาทำให้คุณสามารถขยายส่วนประกอบของบุคคลที่สามด้วยฟังก์ชันการทำงานของคุณเองในรูปแบบเชิงวัตถุ คุณสามารถทำงานกับส่วนประกอบต่างๆ ในภาษาที่สอดคล้องกับ CLS ได้อย่างง่ายดาย และเมื่อทำการดีบัก คุณจะสามารถดำเนินการเรียกใช้ฟังก์ชันระหว่างส่วนประกอบและระหว่างภาษาในแอปพลิเคชันเดียวกันได้ การจัดการข้อยกเว้นยังสอดคล้องกันในภาษาต่างๆ หากส่วนประกอบในภาษาหนึ่งมีข้อยกเว้น ส่วนประกอบนั้นสามารถตรวจจับและจัดการได้ด้วยโค้ดที่เขียนในภาษาอื่น สิ่งสำคัญที่สุดคือช่วยให้คุณและทีมมีอิสระในการเลือกภาษาที่ต้องการทำงาน
16 ต.ค. 2544 - อัปเดตสำหรับเบต้า 2