using _14_ArrayOfObjects_TimeSpan_Casting.Models;
using _14_ArrayOfObjects_TimeSpan_Casting.Models.Bases;
using System.Globalization;
namespace _14_ArrayOfObjects_TimeSpan_Casting
{
internal class Program
{
static void Main(string[] args)
{
#region Array of Objects (Obje Dizisi) ve TimeSpan Veri Tipi
Sarki[] sarkilar = new Sarki[2] // array'i new'lerken içerisindeki elemanları da new'leyip her elemanın özelliklerini set ediyoruz
{
new Sarki()
{
Adi = "Kış Güneşi", // Medya base sınıfı özelliği
Suresi = new TimeSpan(0, 3, 56), // Medya base sınıfı özelliği.
// TimeSpan için 1. yöntem: bu overload'da ilk parametre saat, ikinci parametre dakika, üçüncü parametre saniye.
CikisTarihi = new DateTime(1994, 04, 17), // Medya base sınıfı özelliği.
// DateTime için 1. yöntem.
TLfiyati = 9.99m, // Medya base sınıfı özelliği.
Sanatci = "Tarkan", // Sarki sub sınıfı özelliği
Album = "Aacayipsin" // Sarki sub sınıfı özelliği
// mp3 formatında olduğu için Sarki sub sınıfı Mp3mu özelliğini atamadığımızda Sarki sınıfında
// default (varsayılan) true atadığımızdan Mp3mu özelliğinin değeri true olacak
},
new Sarki()
{
Adi = "Dönence", // Medya base sınıfı özelliği
Suresi = TimeSpan.Parse("00:06:45"), // Medya base sınıfı özelliği.
// TimeSpan için 2. yöntem: saat (0), dakika (6) ve saniye (45) için CultureInfo kullanmamıza gerek yok
// çünkü formatı bölgelere göre değişmiyor.
CikisTarihi = DateTime.Parse("23.05.1981", new CultureInfo("tr-TR")), // Medya base sınıfı özelliği.
// DateTime için 2. yöntem: Türkiye bölgesine göre gün.ay.yıl formatı
TLfiyati = 4.99M, // Medya base sınıfı özelliği
Sanatci = "Barış Manço", // Sarki sub sınıfı özelliği
Album = "Sözüm Meclisten Dışarı", // Sarki sub sınıfı özelliği
Mp3mu = false // Sarki sub sınıfı özelliği.
// Bu şarkının formatı mp3 değil, bu yüzden default true değerini kullanmasın diye false atadık.
}
};
Console.WriteLine("*** Şarkılar ***");
foreach (Sarki sarki in sarkilar)
{
Console.WriteLine($"Adı: {sarki.Adi}\n" +
$"Süresi: {sarki.Suresi.Minutes} dakika {sarki.Suresi.Seconds} saniye\n" + // MilliSeconds, Seconds, Minutes, Hours ve Days özellikleri
// milisaniye, saniye, dakika, saat ve gün parçasını döner,
// örneğin burada Minutes özelliği atanan dakikayı,
// Seconds özelliği ise atanan saniyeyi dönecek
$"Toplam Süresi: {sarki.Suresi.TotalMilliseconds} saniye\n" + // TotalMilliseconds, TotalSeconds, TotalMinutes, TotalHours ve TotalDays gibi
// Total ile başlayan özellikler
// milisaniye, saniye, dakika, saat veya gün cinsinden toplamı döner,
// örneğin burada şarkının toplam saniyesini dönecek
$"Çıkış Tarihi: {sarki.CikisTarihi.ToString("dd.MM.yyyy")}\n" + // ToString methodu üzerinden gün(dd).ay(MM).yıl(yyyy) formatında tarihi dönecek
$"Sanatçı: {sarki.Sanatci}\n" +
$"Albüm: {sarki.Album}\n" +
$"Fiyatı: {sarki.TLfiyati} TL\n" +
$"Formatı: {(sarki.Mp3mu ? "Mp3" : "Diğer")}\n");
}
Film[] filmler = new Film[3]; // önce array'i oluşturuyoruz
filmler[0] = new Film(); // sonra her bir array index'indeki elemanı new'liyoruz ve her elemanın özelliklerini set ediyoruz
filmler[0].Adi = "Baby Driver"; // Medya base sınıfı özelliği
filmler[0].Suresi = TimeSpan.Parse("01:53:00"); // Medya base sınıfı özelliği
filmler[0].CikisTarihi = DateTime.Parse("28.06.2017", new CultureInfo("tr-TR")); // Medya base sınıfı özelliği
filmler[0].TLfiyati = 18.99m; // Medya base sınıfı özelliği
filmler[0].GoruntuFormati = Enums.GoruntuFormati.UltraHD; // Video base sınıfı özelliği
filmler[0].Yonetmen = "Edgar Wright"; // Film sub sınıfı özelliği
filmler[0].Oyuncular = new string[] { "Ansel Elgort", "Lily James", "Kevin Spacey", "Jon Hamm", "Jamie Foxx" }; // Film sub sınıfı özelliği
filmler[0].ImdbPuani = 7.6F;
filmler[1] = new Film();
filmler[1].Adi = "The Matrix"; // Medya base sınıfı özelliği
filmler[1].Suresi = TimeSpan.Parse("02:16"); // Medya base sınıfı özelliği, saniye 0 ise yazmak zorunlu değil
filmler[1].CikisTarihi = DateTime.Parse("03.09.1999", new CultureInfo("tr-TR")); // Medya base sınıfı özelliği
filmler[1].TLfiyati = 9.99M; // Medya base sınıfı özelliği
filmler[1].GoruntuFormati = Enums.GoruntuFormati.HD; // Video base sınıfı özelliği
filmler[1].Yonetmen = "Wachowski Kardeşler"; // Film sub sınıfı özelliği
filmler[1].Oyuncular = new string[4] { "Keanu Reeves", "Carrie-Anne Moss", "Laurence Fishburne", "Hugo Weaving" }; // Film sub sınıfı özelliği
filmler[1].ImdbPuani = 8.7f;
filmler[2] = new Film();
filmler[2].Adi = "Eşkiya"; // Medya base sınıfı özelliği
filmler[2].Suresi = TimeSpan.Parse("02:03"); // Medya base sınıfı özelliği, saniye 0 ise yazmak zorunlu değil
filmler[2].CikisTarihi = DateTime.Parse("29.11.1996", new CultureInfo("tr-TR")); // Medya base sınıfı özelliği
filmler[2].TLfiyati = 4.99m; // Medya base sınıfı özelliği
filmler[2].GoruntuFormati = Enums.GoruntuFormati.SD; // Video base sınıfı özelliği
filmler[2].Yonetmen = "Yavuz Turgul"; // Film sub sınıfı özelliği
filmler[2].Oyuncular = new string[] { "Şener Şen", "Uğur Yücel" }; // Film sub sınıfı özelliği
filmler[2].ImdbPuani = 8.1F;
Console.WriteLine("*** Filmler ***");
string oyuncular ; // filmin oyuncularını konsola yazdırmak için tanımladık
string oyuncu; // filmin oyuncular dizisindeki her bir oyuncu
Film film; // filmler dizisindeki her bir film
for (int i = 0; i < filmler.Length; i++) // filmleri dönüyoruz
{
film = filmler[i]; // i. index'teki Film tipindeki objeyi film değişkenine atıyoruz
oyuncular = ""; // her bir film için oyuncuları temizliyoruz, dolayısıyla ilk değer olarak "" atadık
if (film.Oyuncular != null && film.Oyuncular.Length > 0) // eğer filmin oyuncuları varsa
{
for (int j = 0; j < film.Oyuncular.Length; j++) // her bir film için oyuncuları dönüyoruz
{
oyuncu = film.Oyuncular[j]; // j. index'teki string tipindeki değeri oyuncu değişkenine atıyoruz
oyuncular += oyuncu + ", "; // sonuna , ekleyerek oyuncu'yu oyuncular'a concatenate ediyoruz
}
oyuncular = oyuncular.Substring(0, oyuncular.Length - 2); // en baştan başla, sondan iki karakter hariç sub string alarak oyuncular'a ata,
// sondaki ',' ile ' ' karakterlerini temizledik
}
Console.WriteLine($"Adı: {film.Adi}\n" +
$"Süresi: {film.Suresi.Hours}:{film.Suresi.Minutes}:{film.Suresi.Seconds}\n" +
$"Toplam Süresi: {film.Suresi.TotalMinutes} dakika\n" +
$"Çıkış Tarihi: {film.CikisTarihi.ToShortDateString()}\n" + // ToShortDateString methodu bilgisayarın bölgesel ayarı Türkçe ise
// Türkçe formatında (gün.ay.yıl),
// değilse o bölgesel ayar formatında tarih döner,
// örneğin İngilizce formatı ay/gün/yıl
$"Formatı: {film.GoruntuFormati}\n" +
$"Yönetmen: {film.Yonetmen}\n" +
$"Oyuncular: {oyuncular}\n" +
$"Fiyatı: {film.TLfiyati} TL\n" +
$"IMDB Puanı: {film.ImdbPuani}\n");
}
#endregion
#region Array of Objects Using Polymorphism (Polymorphism Kullanılan Obje Dizisi) ve is ile as Kullanımı
Medya[] medyaDizisi = new Medya[] // base Medya tipinde bir referans değişkeni üzerinden base Medya tipinde bir dizi oluşturuyoruz
{
new Video() // dizinin ilk elemanına sub Video tipinde bir obje atıyoruz
{
Adi = "Morcheeba - Enjoy The Ride", // Medya base class'ı özelliği
CikisTarihi = DateTime.Parse("18.04.2008", new CultureInfo("tr-TR")), // Medya base class'ı özelliği
Suresi = TimeSpan.Parse("00:04:02"), // Medya base class'ı özelliği
GoruntuFormati = Enums.GoruntuFormati.HD // Video sub class'ı özelliği
// Medya base class'ı TLfiyati özelliğini atamadığımız için otomatik 0 değeri atanacak
},
new Sarki() // dizinin ikinci elemanına sub Sarki tipinde bir obje atıyoruz
{
Adi = "I Want It All", // Medya base class'ı özelliği
CikisTarihi = DateTime.Parse("01.02.1989", new CultureInfo("tr-TR")), // Medya base class'ı özelliği
Suresi = TimeSpan.FromSeconds(297), // 4 dakika 57 saniye
TLfiyati = 3.99m, // Medya base class'ı özelliği
Sanatci = "Queen", // Sarki sub class'ı özelliği
Album = "The Miracle" // Sarki sub class'ı özelliği
},
new Film() // dizinin üçüncü elemanına sub Film tipinde bir obje atıyoruz
{
Adi = "Avatar", // Medya base class'ı özelliği
CikisTarihi = DateTime.Parse("18.12.2009", new CultureInfo("tr-TR")), // Medya base class'ı özelliği
Suresi = TimeSpan.Parse("02:42"), // Medya base class'ı özelliği
TLfiyati = 9.99m, // Medya base class'ı özelliği
GoruntuFormati = Enums.GoruntuFormati.UltraHD, // Video base class'ı özelliği
Yonetmen = "James Cameron", // Film sub class'ı özelliği
Oyuncular = new string[] { "Zoe Saldana", "Sam Worthington", "Sigourney Weaver" }, // Film sub class'ı özelliği
ImdbPuani = 7.9f // Film sub class'ı özelliği
}
};
Console.WriteLine("*** Medya ***");
// bu örnekte medyaDizisi değişkeninin tipi Medya[] olduğundan ve her bir elemanının tipi de Medya olduğundan sadece Medya sınıfı özelliklerini kullanabiliriz
foreach (Medya medya in medyaDizisi)
{
Console.WriteLine($"Medya Adı: {medya.Adi}\n" +
$"Medya Süresi: {medya.Suresi.Hours.ToString().PadLeft(2, '0')}:{medya.Suresi.Minutes.ToString().PadLeft(2, '0')}:{medya.Suresi.Seconds.ToString().PadLeft(2, '0')}\n" +
$"Medya Çıkış Tarihi: {medya.CikisTarihi.ToShortDateString()}\n" +
$"Medya Fiyatı: {medya.TLfiyati} TL\n");
}
Console.WriteLine("*** Video, Şarkı, Film ***");
// ancak medyaDizisi değişkeni sırasıyla Video, Sarki ve Film tipinde objelere refere ettiğinden
// bu örnekte ihtiyaç halinde ilgili tiplere casting işlemi uygulayarak tip özelliklerini kullanabiliriz
Video videoElemani; // aşağıdaki döngüde Medya tipindeki referans değişkeninin refere ettiği Medya tipindeki objenin Video tipine cast edilip atanacağı değişken
Sarki sarkiElemani; // aşağıdaki döngüde Medya tipindeki referans değişkeninin refere ettiği Medya tipindeki objenin Sarki tipine cast edilip atanacağı değişken
Film filmElemani; // aşağıdaki döngüde Medya tipindeki referans değişkeninin refere ettiği Medya tipindeki objenin Film tipine cast edilip atanacağı değişken
foreach (Medya medya in medyaDizisi)
{
// önce Medya tip özellikleri değerlerini yazdırıyoruz
Console.WriteLine($"Medya Adı: {medya.Adi}\n" +
$"Medya Süresi: {medya.Suresi.ToString(@"hh\:mm\:ss")}\n" +
$"Medya Çıkış Tarihi: {medya.CikisTarihi.ToShortDateString()}\n" +
$"Medya Fiyatı: {medya.TLfiyati.ToString("N2")} TL");
// daha sonra Medya tipindeki medya değişkeninin refere ettiği Video, Sarki ve Film tipindeki objelerin tiplerini
// kontrol edip casting işlemi uyguluyoruz
if (medya is Film) // eğer medya referans değişkeni Film tipinde bir objeye refere ediyorsa
{
//filmElemani = (Film)medya; // casting işlemi 1. yöntem
filmElemani = medya as Film; // casting işlemi 2. yöntem
// casting işleminden sonra Film sınıfı ve miras aldığı Video sınıfı özelliklerini kullanabiliriz
Console.WriteLine($"Film Yönetmeni: {filmElemani.Yonetmen}\n" +
$"Film IMDB Puanı: {filmElemani.ImdbPuani}\n" +
$"Film Formatı: {filmElemani.GoruntuFormati}");
// filmin her bir oyuncusunu turlayıp konsola yazdırıyoruz
if (filmElemani.Oyuncular is not null && filmElemani.Oyuncular.Length > 0) // eğer filmin oyuncuları varsa
{
Console.WriteLine("Film Oyuncuları:");
foreach (string oyuncuElemani in filmElemani.Oyuncular)
{
Console.Write($"Oyuncu: {oyuncuElemani}\n");
}
}
}
else if (medya is Sarki) // eğer medya referans değişkeni Sarki tipinde bir objeye refere ediyorsa
{
sarkiElemani = medya as Sarki; // casting işlemi
// casting işleminden sonra Sarki sınıfı özelliklerini kullanabiliriz
Console.WriteLine($"Şarkı Sanatçısı: {sarkiElemani.Sanatci}\n" +
$"Şarkı Albümü: {sarkiElemani.Album}\n" +
$"Şarkı Formatı: {(sarkiElemani.Mp3mu ? "Mp3" : "Diğer")}\n");
}
else //if (medya is Video) // sadece Video tipi kontrolü kaldığından if koşulunu yazmaya gerek yok, eğer medya referans değişkeni Video tipinde bir objeye refere ediyorsa
{
videoElemani = medya as Video; // casting işlemi
// casting işleminden sonra Video sınıfı özelliklerini kullanabiliriz
Console.WriteLine($"Video Formatı: {videoElemani.GoruntuFormati}\n");
}
}
#endregion
}
}
}