Overloading Operator
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C# di Coddy. Pelajaran 36 dari 70.
Operator overloading memungkinkan kamu menentukan cara kerja operator seperti +, -, atau == dengan class kustommu. Daripada memanggil method seperti point1.Add(point2), kamu bisa menulis bentuk yang lebih alami, point1 + point2.
Untuk melakukan overload pada operator, kamu membuat method statis khusus menggunakan kata kunci operator:
public class Vector
{
public int X { get; }
public int Y { get; }
public Vector(int x, int y)
{
X = x;
Y = y;
}
public static Vector operator +(Vector a, Vector b)
{
return new Vector(a.X + b.X, a.Y + b.Y);
}
}Sekarang kamu bisa menjumlahkan vektor secara alami:
Vector v1 = new Vector(3, 4);
Vector v2 = new Vector(1, 2);
Vector v3 = v1 + v2; // X = 4, Y = 6Method harus berupa public static, dan setidaknya satu parameter harus bertipe yang memuatnya. Kamu dapat melakukan overload pada operator aritmetika (+, -, *, /), operator perbandingan (==, !=, <, >), dan operator unary (-, !, ++).
Perhatikan bahwa operator perbandingan harus di-overload secara berpasangan. Jika kamu mendefinisikan ==, kamu juga harus mendefinisikan !=.
Gunakan operator overloading saat membuat kodemu lebih intuitif, terutama untuk tipe matematika seperti vektor, bilangan kompleks, atau uang. Hindari penggunaannya saat makna operasinya tidak langsung jelas.
Tantangan
MudahMari buat Fraction class agar penggunaan pecahan terasa alami melalui operator overloading. Alih-alih memanggil method seperti fraction1.Add(fraction2), kamu bisa menulis fraction1 + fraction2 yang lebih intuitif.
Kamu akan mengatur kodemu dalam dua file:
Fraction.cs: BuatFractionclass di namespaceMathyang merepresentasikan pecahan dengan pembilang dan penyebut. Pecahanmu harus memiliki:- Dua property bilangan bulat hanya-baca:
NumeratordanDenominator - Constructor yang menerima pembilang dan penyebut (dalam urutan tersebut)
- Operator
+yang di-overload untuk menjumlahkan dua pecahan menggunakan rumus:(a/b) + (c/d) = (a*d + c*b) / (b*d) - Operator
*yang di-overload untuk mengalikan dua pecahan:(a/b) * (c/d) = (a*c) / (b*d) - Operator
==yang di-overload dan mengembalikantruejika dua pecahan sama (kalikan silang untuk membandingkan:a*d == c*b) - Operator
!=yang di-overload (wajib saat kamu meng-overload==) dan mengembalikan kebalikan dari== - Method
GetDisplay()yang mengembalikan pecahan sebagai string dengan format"{Numerator}/{Denominator}"
- Dua property bilangan bulat hanya-baca:
Program.cs: Di file utama, buat dua pecahan menggunakan nilai input. Tunjukkan operator yang di-overload dengan menjumlahkan dan mengalikannya, serta memeriksa apakah keduanya sama. Cetak hasilnya untuk menunjukkan bahwa operator-operator tersebut bekerja secara alami.
Kamu akan menerima empat input:
- Pembilang pecahan pertama (bilangan bulat)
- Penyebut pecahan pertama (bilangan bulat)
- Pembilang pecahan kedua (bilangan bulat)
- Penyebut pecahan kedua (bilangan bulat)
Cetak output dengan format ini:
Fraction 1: {GetDisplay()}
Fraction 2: {GetDisplay()}
Sum: {GetDisplay()}
Product: {GetDisplay()}
Are equal: {True/False}Misalnya, jika inputnya adalah 1, 2, 2, dan 4, outputnya akan seperti ini:
Fraction 1: 1/2
Fraction 2: 2/4
Sum: 8/8
Product: 2/8
Are equal: TruePerhatikan bahwa 1/2 dan 2/4 dikenali sebagai nilai yang sama karena 1*4 == 2*2. Jumlah dan hasil kalinya dihitung tanpa penyederhanaan, itu tidak masalah untuk tantangan ini. Keunggulannya adalah kamu kini bisa menggunakan operator yang familier untuk mengolah pecahan dengan cara yang alami!
Coba sendiri
using System;
using Math;
class Program
{
public static void Main(string[] args)
{
// Baca input untuk pecahan pertama
int num1 = Convert.ToInt32(Console.ReadLine());
int den1 = Convert.ToInt32(Console.ReadLine());
// Baca input untuk pecahan kedua
int num2 = Convert.ToInt32(Console.ReadLine());
int den2 = Convert.ToInt32(Console.ReadLine());
// TODO: Buat dua object Fraction menggunakan nilai input
// TODO: Gunakan operator + yang telah di-overload untuk menjumlahkan pecahan
// TODO: Gunakan operator * yang telah di-overload untuk mengalikan pecahan
// TODO: Gunakan operator == yang telah di-overload untuk memeriksa kesamaan
// TODO: Cetak output dalam format yang diminta:
// Pecahan 1: {GetDisplay()}
// Pecahan 2: {GetDisplay()}
// Jumlah: {GetDisplay()}
// Hasil kali: {GetDisplay()}
// Apakah sama: {True/False}
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalNamespace & DirektifPengantar class & objectKata Kunci 'this'Method dan ParameterField vs PropertyKonstruktorInisialisasi objectRingkasan: Kalkulator Sederhana4Pewarisan
Sintaks Dasar Pewarisan (:)Kata Kunci 'base'Kata Kunci Virtual & OverrideClass SealedBase Class 'object'Rangkuman: Hierarki Karyawan7Fitur Lanjutan
Overloading OperatorIndexer (this[])Penimpaan ToString()Extension methodRingkasan: Custom list2Property & Anggota Statis
Property yang Diimplementasikan OtomatisProperty Hanya Baca dan Hanya TulisField dan method StatisClass StatisAnggota Berbentuk Ekspresi5Polimorfisme & Antarmuka
Polimorfisme saat kompilasi vs runtimeAntarmuka vs kelas abstrakBeberapa antarmukaAntarmuka eksplisitUpcasting & DowncastingRingkasan, Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi daripada PewarisanGenerics (class dan method)Delegate dan EventAtribut dan ReflectionIDisposable dan Pernyataan usingDasar-Dasar Dependency Injection11Pola Desain Bagian 2
Pola PerintahPola AdapterPola DecoratorPola Template MethodPola StatePola CompositeLatihan sendiri: Compiler C# online