Arayüz vs Soyut Sınıf
Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 26 / 70.
Hem arayüzler hem de soyut sınıflar, diğer sınıfların uyması gereken sözleşmeleri tanımlamanıza olanak tanır; ancak farklı amaçlara ve belirgin yeteneklere sahiptirler.
Bir arayüz, herhangi bir uygulama içermeden bir sınıfın ne yapması gerektiğini tanımlar. Bu, saf bir sözleşmedir:
public interface IFlyable
{
void Fly();
}
public class Bird : IFlyable
{
public void Fly()
{
Console.WriteLine("Flapping wings");
}
}Bir soyut sınıf hem bir sözleşme hem de paylaşılan bir uygulama sağlayabilir. Kısmi bir taslaktır:
public abstract class Vehicle
{
public string Brand { get; set; }
public void StartEngine()
{
Console.WriteLine("Engine started");
}
public abstract void Drive(); // Uygulanmalıdır
}
public class Car : Vehicle
{
public override void Drive()
{
Console.WriteLine("Driving on roads");
}
}Temel farklılıklar kalıtım kuralları ve amaçla ilgilidir.
Bir sınıf birden fazla arabirim uygulayabilir, ancak yalnızca bir soyut sınıftan miras alabilir.
İlişkili olmayan sınıfların davranış paylaşması gerektiğinde bir arayüz kullanın (kuşlar ve uçaklar için IFlyable gibi). İlişkili sınıflar ortak kodu ve durumu paylaştığında soyut bir sınıf kullanın (araçların motor çalıştırma mekanizmasını paylaşması gibi).
Özet sınıflar, üyelerinde kuruculara, alanlara ve erişim belirleyicilerine sahip olabilir. Arayüzler geleneksel olarak bunlara sahip olamazdı, ancak modern C# varsayılan uygulamalara izin verir.
Şüpheye düştüğünde esneklik için arayüzleri tercih et - paylaşılan uygulama gerekli hâle gelirse daha sonra her zaman soyut bir sınıf ekleyebilirsin.
Görev
KolayArayüzlerin ve soyut sınıfların ne zaman kullanılacağını gösteren bir medya oynatıcı sistemi oluşturalım. İlişkisiz cihazların oynatma davranışını bir arayüz aracılığıyla paylaşacağı, ilişkili medya türlerinin ise ortak uygulamayı bir soyut sınıf aracılığıyla paylaşacağı bir tasarım oluşturacaksın.
Kodunu dört dosyaya ayıracaksın:
IPlayable.cs:IPlayablead alanındaMediaadlı bir arayüz tanımla. Bu arayüz, telefon, TV veya özel bir müzik oynatıcı olması fark etmeksizin medya oynatabilen her şey için sözleşmeyi temsil eder.Play()adlı ve bir dize döndüren tek bir yöntem bildirmelidir.MediaFile.cs:MediaFilead alanındaMediaadlı soyut bir sınıf tanımla. Bu sınıf, tüm medya dosyalarının ortak temelini temsil eder. BirTitleözelliği (string) ve birDurationözelliği (int, saniye cinsinden) bulunmalıdır. Her iki değeri ayarlayan bir oluşturucu ekle.GetInfo()döndüren"{Title} ({Duration}s)"adlı somut bir yöntem ekle. Ayrıca bir dize döndüren soyutGetType()yöntemini bildir; her medya türü bunun ne tür bir dosya olduğunu tanımlayacaktır.AudioFile.cs:AudioFilead alanındaMediasınıfından kalıtım alan veMediaFilearayüzünü uygulayan birIPlayablesınıfı tanımla. BirArtistözelliği (string) ekle. Oluşturucu başlık, süre ve sanatçı değerlerini kabul etmelidir.GetType()yöntemini"Audio"döndürecek şekilde geçersiz kıl.Play()yöntemini"Playing audio: {Title} by {Artist}"döndürecek şekilde uygula.Program.cs: Ana dosyanda, girdi değerlerini kullanarak birAudioFileoluştur. Sınıfın her iki yönünü de göster:GetInfo()veGetType()yöntemlerini (soyut sınıftan miras alınan) çağır, ardındanPlay()yöntemini (arayüzden) çağır. Ses dosyasını birIPlayabledeğişkeninde sakla ve arayüz çok biçimliliğini göstermek içinPlay()yöntemini tekrar çağır.
Üç girdi alacaksın:
- Şarkı adı
- Saniye cinsinden süre
- Sanatçı adı
Çıktıyı şu biçimde yazdır:
Info: {GetInfo() result}
Type: {GetType() result}
Direct: {Play() result}
Via Interface: {Play() result from IPlayable variable}Örneğin girdiler Bohemian Rhapsody, 354 ve Queen ise çıktı şu şekilde olmalıdır:
Info: Bohemian Rhapsody (354s)
Type: Audio
Direct: Playing audio: Bohemian Rhapsody by Queen
Via Interface: Playing audio: Bohemian Rhapsody by QueenAudioFile sınıfının her iki yaklaşımdan da nasıl yararlandığına dikkat et: soyut sınıftan ortak uygulamayı (GetInfo()) miras alırken aynı zamanda IPlayable sözleşmesini de yerine getirir. Soyut sınıf, ilişkili medya türleri için kodun yeniden kullanılmasını sağlarken arayüz, herhangi bir ilgisiz sınıfın aynı kalıtım hiyerarşisini paylaşmadan "oynatılabilir" olmasına olanak tanır.
Kendin dene
using System;
using Media;
class Program
{
public static void Main(string[] args)
{
// Giriş değerlerini oku
string title = Console.ReadLine();
int duration = Convert.ToInt32(Console.ReadLine());
string artist = Console.ReadLine();
// TODO: Giriş değerlerini kullanarak bir AudioFile oluştur
// TODO: Info: yazdır, ardından GetInfo() sonucunu
// TODO: Type: yazdır, ardından GetType() sonucunu
// TODO: Direct: yazdır, ardından Play() sonucunu
// TODO: Ses dosyasını bir IPlayable değişkeninde sakla
// TODO: Via Interface: yazdır, ardından IPlayable değişkeninden Play() sonucunu
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici Dosyalarİsim Alanları ve YönergelerSınıf ve Nesnelere Giriş'this' Anahtar KelimesiMetotlar ve ParametrelerAlanlar ve ÖzelliklerYapıcı MetotlarNesne BaşlatıcılarÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (:) Sözdizimi'base' Anahtar KelimesiVirtual ve Override Anahtar KelimeleriSealed Sınıflar'object' Temel SınıfıÖzet - Çalışan Hiyerarşisi7İleri Düzey Özellikler
Operatör Aşırı Yüklemeİndeksleyiciler (this[])ToString() Geçersiz KılmaGenişletme MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişThread-Safe SingletonFactory KalıbıObserver Kalıbı (Olaylar)Strategy Kalıbı2Özellikler ve Statik Üyeler
Otomatik Uygulanan ÖzelliklerSadece Okunur/Yazılır ÖzelliklerStatik Alanlar ve MetotlarStatik Sınıflarİfade Gövdeli Üyeler5Polimorfizm ve Arayüzler
Derleme vs Çalışma Zamanı PolimorfizmiArayüz vs Soyut SınıfÇoklu ArayüzlerBelirgin ArayüzlerUpcasting ve DowncastingÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kalıtım yerine KompozisyonGenerics (Sınıflar ve Metotlar)Delegates ve EventlerAttributes ve ReflectionIDisposable ve using İfadesiDependency Injection Temelleri11Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit Kalıbı3Sınıf Mimarisi
Örnek vs Statik Veri'readonly' ve 'const' Anahtar KelimeleriDestekleyici Alanlar (Backing Fields)Özet - Banka Hesabı Yöneticisi6Kapsülleme
Erişim BelirleyicilerKapsülleme için ÖzelliklerVeri Gizleme UygulamasıDeğişmezlik KalıplarıÖzet - Öğrenci KayıtlarıKendi başına pratik yap: Online C# derleyicisi