Apa itu Antarmuka COM?
Jika Anda mengetahui C# atau Java, antarmuka harus menjadi konsep yang familier. Antarmuka mendefinisikan serangkaian metode yang dapat didukung objek, tanpa menentukan apa pun tentang implementasi. Antarmuka menandai batas yang jelas antara kode yang memanggil metode dan kode yang mengimplementasikan metode . Dalam istilah ilmu komputer, pemanggil diputar dari implementasi.
Di C++, yang terdekat setara dengan antarmuka adalah kelas virtual murni—yaitu, kelas yang hanya berisi metode virtual murni dan tidak ada anggota lain. Berikut adalah contoh hipotetis antarmuka:
// The following is not actual COM.
// Pseudo-C++:
interface IDrawable
{
void Draw();
};
Ide dari contoh ini adalah bahwa sekumpulan objek di beberapa pustaka grafis dapat digambar. Antarmuka IDrawable
menentukan operasi yang harus didukung objek yang dapat digambar. (Menurut konvensi, nama antarmuka dimulai dengan "I".) Dalam contoh ini, IDrawable
antarmuka mendefinisikan satu operasi: Draw
.
Semua antarmuka bersifat abstrak, sehingga program tidak dapat membuat instans IDrawable
objek seperti itu. Misalnya, kode berikut tidak akan dikompilasi.
IDrawable draw;
draw.Draw();
Sebagai gantinya, pustaka grafis menyediakan objek yang mengimplementasikanIDrawable
antarmuka. Misalnya, pustaka mungkin menyediakan objek bentuk untuk menggambar bentuk dan objek bitmap untuk menggambar gambar. Di C++, ini dilakukan dengan mewarisi dari kelas dasar abstrak umum:
class Shape : public IDrawable
{
public:
virtual void Draw(); // Override Draw and provide implementation.
};
class Bitmap : public IDrawable
{
public:
virtual void Draw(); // Override Draw and provide implementation.
};
Kelas Shape
dan Bitmap
menentukan dua jenis objek yang dapat digambar yang berbeda. Setiap kelas mewarisi dari IDrawable
dan menyediakan implementasi Draw
metodenya sendiri. Secara alami, kedua implementasi mungkin sangat berbeda. Misalnya, metode ini Shape::Draw
mungkin memerkosterisasi sekumpulan garis, sementara Bitmap::Draw
akan memadukan array piksel.
Program yang menggunakan pustaka grafis ini akan memanipulasi Shape
dan Bitmap
objek melalui IDrawable
penunjuk, daripada menggunakan Shape
atau Bitmap
menunjuk secara langsung.
IDrawable *pDrawable = CreateTriangleShape();
if (pDrawable)
{
pDrawable->Draw();
}
Berikut adalah contoh yang mengulang array IDrawable
pointer. Array mungkin berisi berbagai macam bentuk, bitmap, dan objek grafis lainnya secara heterogen, selama setiap objek dalam array mewarisi IDrawable
.
void DrawSomeShapes(IDrawable **drawableArray, size_t count)
{
for (size_t i = 0; i < count; i++)
{
drawableArray[i]->Draw();
}
}
Poin kunci tentang COM adalah bahwa kode panggilan tidak pernah melihat jenis kelas turunan. Dengan kata lain, Anda tidak akan pernah mendeklarasikan variabel jenis Shape
atau Bitmap
dalam kode Anda. Semua operasi pada bentuk dan bitmap dilakukan menggunakan IDrawable
penunjuk. Dengan cara ini, COM mempertahankan pemisahan yang ketat antara antarmuka dan implementasi. Detail Shape
implementasi kelas dan Bitmap
dapat berubah—misalnya, untuk memperbaiki bug atau menambahkan kemampuan baru—tanpa perubahan pada kode panggilan.
Dalam implementasi C++, antarmuka dinyatakan menggunakan kelas atau struktur.
Catatan
Contoh kode dalam topik ini dimaksudkan untuk menyampaikan konsep umum, bukan praktik dunia nyata. Menentukan antarmuka COM baru berada di luar cakupan seri ini, tetapi Anda tidak akan menentukan antarmuka langsung dalam file header. Sebaliknya, antarmuka COM didefinisikan menggunakan bahasa yang disebut Bahasa Definisi Antarmuka (IDL). File IDL diproses oleh pengkompilasi IDL, yang menghasilkan file header C++.
class IDrawable
{
public:
virtual void Draw() = 0;
};
Ketika Anda bekerja dengan COM, penting untuk diingat bahwa antarmuka bukanlah objek. Mereka adalah kumpulan metode yang harus diterapkan objek. Beberapa objek dapat mengimplementasikan antarmuka yang sama, seperti yang ditunjukkan Shape
dengan contoh dan Bitmap
. Selain itu, satu objek dapat mengimplementasikan beberapa antarmuka. Misalnya, pustaka grafis mungkin menentukan antarmuka bernama ISerializable
yang mendukung penyimpanan dan pemuatan objek grafis. Sekarang pertimbangkan deklarasi kelas berikut:
// An interface for serialization.
class ISerializable
{
public:
virtual void Load(PCWSTR filename) = 0; // Load from file.
virtual void Save(PCWSTR filename) = 0; // Save to file.
};
// Declarations of drawable object types.
class Shape : public IDrawable
{
...
};
class Bitmap : public IDrawable, public ISerializable
{
...
};
Dalam contoh ini, Bitmap
kelas mengimplementasikan ISerializable
. Program dapat menggunakan metode ini untuk menyimpan atau memuat bitmap. Namun, Shape
kelas tidak menerapkan ISerializable
, sehingga tidak mengekspos fungsionalitas tersebut. Diagram berikut menunjukkan hubungan pewarisan dalam contoh ini.
Bagian ini telah memeriksa dasar konseptual antarmuka, tetapi sejauh ini kami belum melihat kode COM yang sebenarnya. Kita akan mulai dengan hal pertama yang harus dilakukan aplikasi COM apa pun: Menginisialisasi pustaka COM.
Berikutnya
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk