Soyut Sınıflar
Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 60 / 104.
Öz sınıf, en az bir saf sanal işlev içeren herhangi bir sınıftır. Eksik bir arayüze sahip olduğu için bir öz sınıfın nesnelerini doğrudan oluşturamazsınız - bu sınıf yalnızca miras alınmak amacıyla vardır.
class Shape {
public:
virtual double area() = 0; // Saf sanal - Shape'i soyut yapar
virtual double perimeter() = 0; // Başka bir saf sanal fonksiyon
void printInfo() { // Normal metot - implementasyonu var
std::cout << "Area: " << area() << std::endl;
}
virtual ~Shape() = default;
};
Shape s; // Hata: soyut sınıf örneği oluşturulamazSoyut sınıflar, saf sanal işlevlerin (uygulaması olmayan), normal sanal işlevlerin (varsayılan uygulamaya sahip) ve sanal olmayan işlevlerin bir karışımını içerebilir. Bu, ortak davranışı tanımlamanıza olanak tanırken türetilmiş sınıfların belirli işlevleri uygulamasını gerektirir.
class Circle : public Shape {
double radius;
public:
Circle(double r) : radius(r) {}
double area() override { return 3.14159 * radius * radius; }
double perimeter() override { return 2 * 3.14159 * radius; }
};
Circle c(5.0); // OK: Circle tüm pure virtual fonksiyonları uygular
c.printInfo(); // Kalıtılan printInfo()'yu kullanır, Circle'ın area()'sını çağırırTüretilmiş bir sınıfın somut (örneği oluşturulabilir) hâle gelmesi için tüm saf sanal işlevleri uygulaması gerekir. Herhangi birini uygulamadan bırakırsa kendisi de soyut kalır. Bu mekanizma, hiyerarşinizdeki her somut sınıfın gerekli işlevselliği sağlamasını güvence altına alır.
Görev
KolayFarklı medya türleri için soyut sınıfların sözleşmeleri nasıl tanımladığını gösteren bir medya oynatıcı sistemi oluşturalım. Her medya oynatıcının ne yapması gerektiğini belirleyen soyut bir temel sınıf oluşturacak, ardından ses ve video içerikleri için somut oynatıcılar uygulayacaksın.
Kodunu üç dosyaya ayıracaksın:
MediaPlayer.h: Tüm medya türleri için şablon görevi gören soyut birMediaPlayersınıfı tanımla. Soyut sınıfında şunlar bulunmalı:- Korumalı bir
std::string titleüyesi - Korumalı bir
int durationüyesi (saniye cinsinden) - Her iki değeri başlatan bir kurucu
- Salt sanal bir
play()yöntemi: her medya türü farklı şekilde oynatılacak - Bir
getMediaType()döndüren salt sanal birstd::stringyöntemi - Şunu yazdıran normal (sanal olmayan) bir
showInfo()yöntemi:<title> (<duration>s) - Type: <mediaType>. Bu yöntem, türü almak içingetMediaType()yöntemini çağırmalı - Sanal bir yok edici
- Korumalı bir
Players.h:MediaPlayersınıfından kalıtım alan iki somut medya oynatıcı uygula:AudioPlayer:- Özel bir
std::string artistüyesi - Başlık, süre ve sanatçı alan bir kurucu
play()yöntemini şu çıktıyı verecek şekilde uygula:Playing audio: <title> by <artist>getMediaType()yöntemini"Audio"döndürecek şekilde uygula
VideoPlayer:- Özel bir
std::string resolutionüyesi - Başlık, süre ve çözünürlük alan bir kurucu
play()yöntemini şu çıktıyı verecek şekilde uygula:Playing video: <title> in <resolution>getMediaType()yöntemini"Video"döndürecek şekilde uygula
- Özel bir
main.cpp: Dört girdi oku (her biri ayrı bir satırda):- Ses parçası başlığı
- Ses süresi (tam sayı)
- Video başlığı
- Video süresi (tam sayı)
Sanatçısı
AudioPlayerolan bir"Unknown Artist"ve çözünürlüğüVideoPlayerolan bir"1080p"oluştur. Her ikisini deMediaPlayer*işaretçilerinden oluşan bir dizide sakla.Dizi üzerinde döngü kurarak her oynatıcı için önce
showInfo(), ardındanplay()çağrısını yap. Her medya öğesi arasında boş bir satır yazdır. İşin bittiğinde dinamik olarak ayrılmış nesnelerin belleğini temizle.
Örneğin girdiler Summer Vibes, 180, Nature Documentary ve 3600 olduğunda:
Summer Vibes (180s) - Type: Audio
Playing audio: Summer Vibes by Unknown Artist
Nature Documentary (3600s) - Type: Video
Playing video: Nature Documentary in 1080pshowInfo() yönteminin soyut temel sınıfta yalnızca bir kez tanımlandığı, ancak salt sanal getMediaType() yöntemini çağırdığına dikkat et. Bu, soyut sınıfların somut uygulamaları, türetilmiş sınıfların sağlaması gereken yöntemlerle bir arada kullanabileceğini gösterir. Geçersiz kılınan tüm yöntemlerde override anahtar sözcüğünü kullanmayı unutma.
Kendin dene
#include <iostream>
#include <string>
#include "MediaPlayer.h"
#include "Players.h"
int main() {
// Girdileri oku
std::string audioTitle;
int audioDuration;
std::string videoTitle;
int videoDuration;
std::getline(std::cin, audioTitle);
std::cin >> audioDuration;
std::cin.ignore();
std::getline(std::cin, videoTitle);
std::cin >> videoDuration;
// TODO: "Unknown Artist" sanatçısıyla bir AudioPlayer oluştur
// TODO: "1080p" çözünürlüğüne sahip bir VideoPlayer oluştur
// TODO: Her ikisini de MediaPlayer* işaretçilerinden oluşan bir dizide sakla
// TODO: Diziyi döngüyle gez ve her oynatıcı için:
// 1. showInfo() çağır
// 2. play() çağır
// 3. Her medya öğesi arasında boş bir satır yazdır
// TODO: Dinamik olarak ayrılmış nesneleri temizle
return 0;
}
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 DosyalarC++ Build ve DerlemeBaşlık Dosyaları ve Kaynak DosyalarıAd Alanları ve KapsamC++'ta OOP'ye GirişSınıflar ve Nesneler'this' İşaretçisiMetotlar (Üye Fonksiyonlar)Öznitelikler (Veri Üyeleri)Ctor ve Dtor TemelleriÖzet - Basit Hesap Makinesi4Sınıf Özellikleri
Örnek ve Statik ÜyelerGetter ve Setter MetotlarıConst Üye FonksiyonlarMutable Anahtar KelimesiStatik Metotlar ve DeğişkenlerFriend Fonksiyonlar ve SınıflarÖzet - Banka Hesabı Yöneticisi7Kalıtım
Temel KalıtımKalıtım Erişim SeviyeleriCtor ve Dtor Çağrılma SırasıMetot Geçersiz KılmaSanal Fonksiyonlar ve VTableÇoklu KalıtımSanal KalıtımÖzet - Çalışan Hiyerarşisi10STL Genel Bakış
STL Genel Bakış ve FelsefesiSTL KonteynerleriİteratörlerSTL AlgoritmalarıFunctor'lar ve Lambda İfadeleriÖzet - Kelime Frekansı13Tasarım Kalıpları 1. Bölüm
Tasarım Kalıplarına GirişSingleton KalıbıFactory ve Abstract FactoryBuilder KalıbıObserver KalıbıStrategy Kalıbı2Bellek Yönetimi
Stack ve Heap Bellekİşaretçiler ve ReferanslarDinamik Bellek (new/delete)C++'ta Akıllı İşaretçilerC++'ta RAIIÖzet - Dinamik Dizi Yöneticisi5Kapsülleme
C++'da Erişim BelirleyicilerDerinlemesine Erişim BelirleyicilerBilgi GizlemeStruct vs Classİç İçe ve Dahili SınıflarÖzet - Öğrenci Kayıt Sistemi8Çok Biçimlilik
Derleme ve Çalışma Zamanı Çok BiçimliliğiFonksiyon Aşırı YüklemeSanal Fonksiyonlara Yeniden BakışSaf Sanal FonksiyonlarSoyut SınıflarC++'ta Arayüz TasarımıDynamic Casting ve RTTIÖzet - Şekil Hesaplayıcı3Yapıcılar ve Yıkıcılar
Varsayılan YapıcıParametreli YapıcıKopya YapıcıTaşıma YapıcısıYapıcı İlklendirme ListeleriTemsilci YapıcılarYıkıcılara Derinlemesine BakışÜç / Beş / Sıfır KuralıÖzet - String Sınıfı6Operatör Aşırı Yükleme
Operatör Aşırı Yüklemeye GirişAritmetik Operatör Aşırı YüklemeKarşılaştırma Operatörü Aşırı YüklemeStream OperatörleriAtama Operatörü Aşırı Yükleme[] ve () Operatör Aşırı YüklemeTip Dönüşüm OperatörleriÖzet - Matris Sınıfı9Şablonlar
Fonksiyon ŞablonlarıSınıf ŞablonlarıŞablon ÖzelleştirmeVariadic ŞablonlarSFINAE ve Type Traits TemelleriÖzet - Generic KonteynerKendi başına pratik yap: Online C++ derleyicisi