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.

ilustrasi memperlihatkan batas antarmuka antara objek dan aplikasi

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.

ilustrasi memperlihatkan pewarisan antarmuka, dengan kelas bentuk dan bitmap menunjuk ke idrawable, tetapi hanya bitmap yang menunjuk ke iserializable

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

Menginisialisasi Pustaka COM