0Pricing
C# Academy · Pelajaran

Memperluas Antarmuka dan Generik

Tambahkan perilaku ke banyak tipe sekaligus.

Memperluas Antarmuka dan Generik adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 4 pelajaran total.

Memperluas Antarmuka

Anda dapat menulis metode ekstensi yang parameter this-nya berupa antarmuka. Setiap jenis yang mengimplementasikan antarmuka tersebut langsung memperoleh metode itu. Inilah cara LINQ menambahkan puluhan metode ke IEnumerable<T>.

Ekstensi Generik pada IEnumerable

Dengan membuat metode menjadi generik terhadap T dan memperluas IEnumerable<T>, pembantu tersebut dapat digunakan untuk urutan apa pun: daftar, larik, hasil kueri, dan banyak lagi.

using System;
using System.Collections.Generic;

public static class EnumerableExtensions
{
    public static bool IsEmpty<T>(this IEnumerable<T> source)
    {
        foreach (var item in source) return false;
        return true;
    }
}

public class Program
{
    public static void Main()
    {
        var nums = new List<int> { 1, 2, 3 };
        Console.WriteLine(nums.IsEmpty());
        Console.WriteLine(new int[0].IsEmpty());
    }
}

Mengiterasi Urutan

Di dalam ekstensi, Anda memperlakukan parameter seperti IEnumerable<T> apa pun. Di sini kita menghitung jumlah tanpa bergantung pada LINQ.

using System;
using System.Collections.Generic;

public static class EnumerableExtensions
{
    public static int SumValues(this IEnumerable<int> source)
    {
        int total = 0;
        foreach (var n in source) total += n;
        return total;
    }
}

public class Program
{
    public static void Main()
    {
        var nums = new List<int> { 10, 20, 30 };
        Console.WriteLine(nums.SumValues());
    }
}

Mengembalikan Urutan Baru

Ekstensi juga dapat mengembalikan urutan. Jika dipadukan dengan yield return, ekstensi menjadi operator bergaya LINQ yang malas.

using System;
using System.Collections.Generic;

public static class EnumerableExtensions
{
    public static IEnumerable<T> EveryOther<T>(this IEnumerable<T> source)
    {
        bool take = true;
        foreach (var item in source)
        {
            if (take) yield return item;
            take = !take;
        }
    }
}

public class Program
{
    public static void Main()
    {
        var letters = new List<string> { "a", "b", "c", "d", "e" };
        foreach (var l in letters.EveryOther())
            Console.WriteLine(l);
    }
}

Batasan Tipe Generik

Anda dapat membatasi parameter generik untuk mewajibkan kemampuan tertentu. Di sini, where T : IComparable<T> memungkinkan kita membandingkan elemen untuk menemukan nilai maksimum.

using System;
using System.Collections.Generic;

public static class EnumerableExtensions
{
    public static T MaxItem<T>(this IEnumerable<T> source) where T : IComparable<T>
    {
        bool started = false;
        T best = default;
        foreach (var item in source)
        {
            if (!started || item.CompareTo(best) > 0) { best = item; started = true; }
        }
        return best;
    }
}

public class Program
{
    public static void Main()
    {
        var nums = new List<int> { 3, 9, 1, 7 };
        Console.WriteLine(nums.MaxItem());
    }
}

Memperluas Antarmuka Kustom

Antarmuka buatan Anda sendiri juga memperoleh manfaat. Tentukan sebuah antarmuka, lalu tambahkan perilaku bersama melalui ekstensi alih-alih menduplikasinya di setiap pengimplementasi.

using System;

public interface INamed { string Name { get; } }

public class Dog : INamed { public string Name => "Rex"; }

public static class NamedExtensions
{
    public static string Greeting(this INamed n) => "Hello, " + n.Name;
}

public class Program
{
    public static void Main()
    {
        var d = new Dog();
        Console.WriteLine(d.Greeting());
    }
}

Beberapa Parameter Tipe

Ekstensi dapat menggunakan beberapa parameter tipe generik. Pembantu proyeksi ini memetakan sebuah urutan menggunakan fungsi, seperti LINQ Select.

using System;
using System.Collections.Generic;

public static class EnumerableExtensions
{
    public static IEnumerable<TResult> Map<TSource, TResult>(
        this IEnumerable<TSource> source, Func<TSource, TResult> f)
    {
        foreach (var item in source) yield return f(item);
    }
}

public class Program
{
    public static void Main()
    {
        var nums = new List<int> { 1, 2, 3 };
        foreach (var s in nums.Map(n => "#" + n))
            Console.WriteLine(s);
    }
}

Menggabungkan dengan LINQ Bawaan

Metode ekstensi Anda dapat digunakan bersama LINQ. Anda dapat merangkai operator kustom dengan operator standar dalam satu alur pemrosesan yang lancar.

using System;
using System.Collections.Generic;
using System.Linq;

public static class EnumerableExtensions
{
    public static IEnumerable<T> EveryOther<T>(this IEnumerable<T> source)
    {
        bool take = true;
        foreach (var item in source) { if (take) yield return item; take = !take; }
    }
}

public class Program
{
    public static void Main()
    {
        var nums = Enumerable.Range(1, 10);
        var result = nums.Where(n => n > 2).EveryOther().ToList();
        Console.WriteLine(string.Join(", ", result));
    }
}

Memperluas IEnumerable Menjangkau Banyak Tipe

Karena larik, daftar, kamus, himpunan hash, dan hasil kueri semuanya mengimplementasikan IEnumerable<T>, satu ekstensi dapat mencakup semuanya sekaligus.

using System;
using System.Collections.Generic;

public static class EnumerableExtensions
{
    public static int CountItems<T>(this IEnumerable<T> source)
    {
        int n = 0;
        foreach (var item in source) n++;
        return n;
    }
}

public class Program
{
    public static void Main()
    {
        Console.WriteLine(new[] { 1, 2, 3 }.CountItems());
        Console.WriteLine(new HashSet<string> { "a", "b" }.CountItems());
    }
}

Mengapa Pola Ini Dapat Diskalakan

Ekstensi antarmuka memberi Anda pembantu polimorfik tanpa pewarisan. Tulis logikanya sekali berdasarkan antarmuka, lalu setiap pengimplementasi, baik yang ada sekarang maupun yang akan datang, dapat menggunakannya tanpa usaha tambahan.

using System;
using System.Collections.Generic;

public static class EnumerableExtensions
{
    public static string JoinWith<T>(this IEnumerable<T> source, string sep)
    {
        return string.Join(sep, source);
    }
}

public class Program
{
    public static void Main()
    {
        var nums = new List<int> { 1, 2, 3 };
        Console.WriteLine(nums.JoinWith(" -> "));
    }
}

Coba Sendiri

Buat operator generik kecil pada IEnumerable<T> dan rangkai dengan LINQ. Perhatikan bahwa operator tersebut bekerja pada tipe urutan apa pun.

using System;
using System.Collections.Generic;
using System.Linq;

public static class EnumerableExtensions
{
    public static IEnumerable<T> WithoutDuplicatesByKey<T, TKey>(
        this IEnumerable<T> source, Func<T, TKey> keySelector)
    {
        var seen = new HashSet<TKey>();
        foreach (var item in source)
            if (seen.Add(keySelector(item))) yield return item;
    }
}

public class Program
{
    public static void Main()
    {
        var words = new[] { "apple", "avocado", "banana", "cherry", "blueberry" };
        var firstPerLetter = words.WithoutDuplicatesByKey(w => w[0]);
        Console.WriteLine(string.Join(", ", firstPerLetter));
    }
}

Pemeriksaan Singkat

Pikirkan cara deklarasi ekstensi bergaya LINQ.

Ringkasan

Memperluas antarmuka, khususnya IEnumerable<T>, merupakan dasar pemrograman bergaya LINQ.

  • Buat metode menjadi generik dan gunakan antarmuka sebagai tipe this.
  • Gunakan yield return untuk membangun operator malas.
  • Terapkan batasan where untuk mewajibkan kemampuan seperti IComparable<T>.
  • Satu ekstensi antarmuka mencakup semua pengimplementasi, termasuk yang akan datang.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Memperluas Antarmuka dan Generik” gratis?

Ya — teks lengkap “Memperluas Antarmuka dan Generik” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Memperluas Antarmuka dan Generik”?

Tambahkan perilaku ke banyak tipe sekaligus. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C# Academy?

Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Memperluas Antarmuka dan Generik” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?

Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Mendefinisikan Metode Ekstensi
  2. Memperluas Antarmuka dan Generik
  3. Resolusi Metode Ekstensi
  4. Merancang Ekstensi yang Baik
← Kembali ke C# Academy