Sanal Metotlar (Virtual Methods) / Virtual / Override
Basitçe ifade etmek gerekirse: Bir temel sınıfta (base class) tanımlanan bir metodun, o sınıftan türeyen alt sınıflarda (derived class) ihtiyaca göre ezilmesine (override) ve farklı bir işlev kazanmasına olanak tanır.
Örnek
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp4
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Jip Jp = new Jip();
MessageBox.Show(Jp.AracinTuru() + " teker sayısı " + Jp.TekerSayisi());
Kamyon Ka = new Kamyon();
MessageBox.Show(Ka.AracinTuru() + " teker sayısı " + Ka.TekerSayisi());
}
}
class Otomobil
{
public virtual string AracinTuru()
{
return "Otomobil";
}
public virtual int TekerSayisi()
{
return 0;
}
}
class Kamyon : Otomobil
{
public override string AracinTuru()
{
return "Kamyon";
}
public override int TekerSayisi()
{
return 6;
}
}
class Jip : Otomobil
{
public override string AracinTuru()
{
return "4x4 Jip";
}
public override int TekerSayisi()
{
return 4;
}
}
}
Örnek
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
/*Kediler Canli = new Kediler();
Canli.SesCikar();*/
Jaguar Ja = new Jaguar();
Ja.SesCikar();
}
class Hayvan
{
public virtual void SesCikar()
{
MessageBox.Show("Genel hayvan sesi...");
}
}
class Kediler : Hayvan {
public override void SesCikar()
{
MessageBox.Show("Miyav...");
}
}
class Jaguar : Kediler //extend
{
public override void SesCikar()
{
MessageBox.Show("Voaaavvv...");
}
}
}
}
Örnek
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Matematik Mt = new Matematik();
//Mt.UcgeninTuru(50, 50);
MessageBox.Show(Mt.TurBul());
/*UcgeninTuru Ut = new UcgeninTuru();
MessageBox.Show(Ut.TurBul()); //Eş kenar Üçgen*/
}
}
public class UcgeninTuru
{
protected int Ak, Bk, Ck;
public UcgeninTuru() //construction + overloading
{
this.Ak = 60;
this.Bk = 60;
this.Ck =60;
}
public UcgeninTuru(int A, int B) //construction + overloading
{
this.Ak = A;
this.Bk = B;
this.Ck = 180 - A - B;
}
public UcgeninTuru(int A, int B, int C) //construction + overloading
{
this.Ak = A;
this.Bk = B;
this.Ck = C;
}
public virtual string TurBul ()
{
if (this.Ak == this.Bk && this.Ak== this.Ck && this.Bk == this.Ck)
{
return "Eş Kenar üçgen";
}
else if (this.Ak == this.Bk || this.Ak==this.Ck || this.Bk == this.Ck)
{
return "İkiz Kenar üçgen";
}
else
{
return "Türü bulunamadı";
}
}
}
public class Matematik : UcgeninTuru {
public override string TurBul() //yukaridaki TurBulun çalışmasına izin vermedi, onu ezdi.
{
if (this.Ak == 90 || this.Bk == 90 || this.Ck == 90)
{
return "Dik üçgen";
}
else
{
return "Türü tespit edilemedi";
}
}
}
}
Örnek
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp4
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Samira sm = new Samira();
MessageBox.Show(sm.Koridoru() + " Koridorunda oynar ve görevi" + " " + sm.KoridorGorevi());
Ornn ornn = new Ornn();
MessageBox.Show(ornn.Koridoru() + " Koridorunda oynar ve görevi" + " " + ornn.KoridorGorevi());
Ryze ry = new Ryze();
MessageBox.Show(ry.Koridoru() + " Koridorunda oynar ve görevi" + " " + ry.KoridorGorevi());
Nautilus naut = new Nautilus();
MessageBox.Show(naut.Koridoru() + " Koridorunda oynar ve görevi" + " " + naut.KoridorGorevi());
Kayn kayn = new Kayn();
MessageBox.Show(kayn.Koridoru() + " Koridorunda oynar ve görevi" + " " + kayn.KoridorGorevi());
}
}
class LoLKarakterleri
{
public virtual string Koridoru()
{
return "LoLKarakterleri";
}
public virtual string KoridorGorevi()
{
return "";
}
}
class Samira : LoLKarakterleri
{
public override string Koridoru()
{
return "Bot yani alt koridor";
}
public override string KoridorGorevi()
{
return "1350 koridor xp'sı kazan ve kendisine fazladan eşya yeri aç";
}
}
class Ornn : LoLKarakterleri
{
public override string Koridoru()
{
return "Top yani üst koridor";
}
public override string KoridorGorevi()
{
return "1350 koridor xp'sı kazan ve oyunda fazladan 2 level arttır , fazladan xp artısı ve ısınlanma büyüsü güçlensin";
}
}
Örnek: Base Kullanımı
using System;
// Üst Sınıf
class Robot
{
public string Model;
public Robot(string model) // Parametre alan yapıcı metot
{
this.Model = model;
Console.WriteLine($"{Model} modeli başlatıldı.");
}
}
// Alt Sınıf
class SavasRobotu : Robot
{
public int SilahGucu;
// 'base(model)' diyerek üst sınıfın constructor'ına parametre gönderiyoruz
public SavasRobotu(string model, int guc) : base(model)
{
this.SilahGucu = guc;
Console.WriteLine($"Silah gücü {SilahGucu} olarak ayarlandı.");
}
}
class Program
{
static void Main()
{
SavasRobotu myBot = new SavasRobotu("RX-78", 100);
}
}