Bir şeyi yeni öğrenenler için örneklerle ve sade anlatımla bilgi aktarılmalıdır. Diğer videoların çoğunda bu yoktu. Burda farklı cümlelerle defalarca yalınlaştırılarak anlatılan sade bir anlatım var. Java öğrenmeye çalışırken bu videodan yararlanmam çaresizliğimi anlatıyor çünkü bu C#. Tebrikler.
Anlatım şekliniz çok güzel düşünmeden, ıııılamadan, madde madde ve hiç durmadan seri bir şekilde önemli noktalarda vurgu yaparak anlatıyorsunuz. Udemy den ücreti karşılığı aldığım eğitim setinden konuyu anlamadığım için videonuzu buldum ve bir defada anladım. Çok teşekkür ederim.
Hocam abstract konusu iş görüşmelerinde sorulunca kafamda yatmadığı için ezbere cevaplayamıyordum. Sayenizde kafama yattı çok güzel anlatabilir hale geldim. Çok teşekkürler.
Ben java ogreniyorum.2 haftadir abstract classin ne oldugunu anlayamadim.cok video izledim makale okudum ama faydasi olmadi.Bu videoyu 1 kere izledim cok iyi anladim.Muthis anlatmishsiniz hocam.Emegine saglik....
Geçmiş videolarda siyah arkaplanda hiçbir şey okunmuyor, gözü yoruyor, insanın içini karartıyordu, beyaz ekranda yazılar rahat okunuyor, güneş doğmuş, bahar gelmiş gibi oldu.
Ne işe yaradığını da anlatsanız güzel olurdu. Yani neden bunu kullanayım amacım nedir ? Normal bir class içine metod oluştururum yine aynı görür değil mi ?
Abstract class ya da interface kullanılması gerektiği yerde kendisini belli ediyor aslında ama bunu farketmek biraz zor. Bir örnek vererek neden kullanıldığını anlatacağım. En azından ben bu şekilde kullanıyorum. Mesela süt ve yoğurt olmak üzere iki farklı ürünüm var. Bu ürünleri temsil eden süt ve yogurt adında iki adet classım olsun. Bu iki ürünü veri tabanına eklemek istiyorum. Interface, abstract class vs bilmediğim zamanlarda şu şekilde yapardım. Her iki classın içine de add() diye bir method oluştururdum ve sonra o classın bilgilerini veritabanına eklerdim. Dezavantajlarım ne olurdu ? Birincisi veritabanına alakasız bir classtan erişim sağlamış olurdum. Kodlarım kendini tekrar ederdi. Çünkü hem süt classında hem de yoğurt classında aynı add methodunu kullanırdım. Ve gelecekte yeni bir ürün daha eklediğimde o ürün içinde bu add() methodunu import ederdim. Böylece kodum karma karışık bir hal alırdı. İkinci bir yol olarak databaseHelper diye bir class oluştururdum ve add methodunu sadece bu classın içinde yazardım. Ve bu methoda hem süt hem de yogurt nesnesini gönderebilmek için methodu override ederdim.. Methodun içinde ise if bloklarıyla iki nesneyi birbirinden ayırır if suistimali yapmış olurdum ki bu da zamanla çok karışık bir hale gelirdi. Peki bu problemi nasıl daha verimli bir şekilde çözebilirim ? Cevap abstract class ya da interface kullanmak. Böylece veritabanına eklenecek olan süt, yoğurt gibi nesnelerin claslarında abstract methodu implement edebiliriz. Artık abstract classımız süt ve yoğurt nesnelerinin referansını tutabilir. Yani add methoduna doğrudan abstract class nesnesi gönderebilirim. Böylece gerekli işlemleri içeride yapabiliriz. abstract class VeritabanıNesnesi{ // şimdilik bir şey yazmaya gerek yok. } class süt : VeritabanıNesnesi{ String type = "süt"; public void getType(){ return type; } } class yogurt : VeritabanıNesnesi { String type = "yogurt"; public void getType(){ return type; } } // DatabaseHelper diye bir classın içinde add() methodu olduğunu varsayarsak public void add(VeritabanıNesnesi nesne){ // nesne.getType() tablosuna gelen nesneyi ekleme işlemleri burada yapılır. Süt ya da yoğurt göndermiş olmanız farketmez. } Umarım anlaşılır anlatabilmişimdir. İyi çalışmalar.
Merhabalar hocam ,Abstract Class'dan instance alamıyorsak, Abstract Class'ın default constructor'ı neden var? İyi günler...
7 ปีที่แล้ว +7
Güzel soru. Aşağıdaki örneği ele alarak konuşalım. abstract class X { public X(int a) => Console.WriteLine($"Abstract class constroctor tetiklendi. Değer : {a}"); } class Y : X { public Y() : base(1) => Console.WriteLine($"Normal class constroctor tetiklendi."); public Y(int a) : base(a) => Console.WriteLine($"Normal class constroctor tetiklendi. Değer : {a}"); } "X" abstract class'ı bir soyut sınıf. "Y" classı ise normal bir sınıftır. Dikkat ederseniz "X" abstract classı içerisinde bir constructor tanımlanmıştır. İşte burada kafalar karışıyor ve "Nesne oluşturulamayan bir sınıfta neden constructor tanımlanabiliyor?" sorusu akıllara geliyor. Aslında bu sorunun cevabı oldukça basittir. Somut sınıfta tanımlanan constructorlar kendilerini uygulayan alt sınıflara bir imza, şablon teşkil etmektedirler. Bunun yanında interface yapılarından farklı olarak, soyut sınıflardan her ne kadar nesne oluşturulamasada miras alacağı sınıfların imzaları dışında normal metot, property vs. gibi değerleride içlerinde barındırabilmektedirler ve bu yapıları miras alan sınıfın nesnesi üzerinde çalıştırmaktadırlar. Soyut sınıflar bu özellikleriyle birlikte içerisindeki birçok işlemde faydalanabilmemiz için alt sınıfın constructorından "base" keywordü ile çağrılmak ve gerekli parametreleri göndermek koşuluyla constructor yapılarınada izin vermektedir. Tüm bunların yanında abstract class yapılarında direkt olarak "new" keywordü ile nesne oluşturulamadığı için zaten içerisindeki constructorlar doğal olarak onu miras alan sınıflar tarafından yukarıda bahsedildiği gibi abstract class içerisindeki gerekli öncelikli işlemleri sağlayabilmek için constructorları tarafından tetiklenmektedirler. Yukarıdaki örneği değerlendirmek için aşağıdaki kodla beraber projeyi derleyip çalıştırırsanız eğer; static void Main(string[] args) { X x = new Y(3); Console.Read(); } "Abstract class constroctor tetiklendi. Değer : 3 Normal class constroctor tetiklendi. Değer : 3" sonucuyla karşılaşacaksınız. Eğer ki gerçekten constructor'ın kullanılamayacağı bir sınıf yapısı görmek istiyorsanız static sınıflara göz atmanızı öneririm. Static olarak tanımlanan sınıflar belleğin static bölümünde tutulan memberlara sahiplerdir ve sade ve sadece sınıf isimleri tarafından bu elemanlara ulaşılabilmektedir. Static sınıflardan miras alınamayacağı için nesne oluşturmaksızın bu sınıflar kullanılabilmektedir. static class Z { public Z() { } } Haliyle yukarıdaki "Z" isimli static sınıfının "kesinlikle" bir nesnesi olamayacağından dolayı ne varsayılan ne de kendi oluşturduğumuz bir constructorı olamayacaktır. Eee haliyle yukarıdaki tanımlamada constructor yanlıştır ve hata verecektir. Sevgilerimle...
7 ปีที่แล้ว +4
Cevaba ek olarak; Eğer ki abstract class içerisindeki constructor parametresiz ya da default ise bir önceki verdiğim cevaptaki mantığın geçerli olmasıyla birlikte sadece alt sınıf constructorı tarafından "base" keywordü ile çağrılma mecburiyetinin olmamasıda söz konusu olmaktadır. Çünkü "base" keywordü, base classın default constructorı dışında manuel oluşturduğumuz birden fazla parametresiz ve parametreli constructorına erişimimizi sağlamakta, aksi taktirde varsayılan olarak default yahut parametresiz constructorı göstermektedir. Sevgiler.
Geri dönüşünüz için çok teşekkür ederim.Anlaşılır,açıklayıcı bir cevap olmuş.Abstract Class 'ın base class olmak için yaratıldığını varsayarsak gerekiyor sanırım.Dün "Instance alınamayan bir class'ın neden Ctor'u olur .Çok saçma!" diye düşünüyordum. Aslın da olayımız instance alıp alamamaktan ziyade,Abstract Class'ın miras için tasarlanmış olması ve miras verecek olan bir yapının içersinde ctor olmaması çok saçma olurmuş, diye düşünüyorum yani :) Olayın özünü doğru kavraya bildim mi bilemiyorum. Bayramınız şimdiden kutlu olsun.Sevgiler...
7 ปีที่แล้ว +2
Code Behind Harikasınız... sizinde bayramınız mübarek olsun. Teşekkürler. Sevgiler.
abstract sınıf içersinde herhangi bir abstract elemanın erişim belirleyicisi protected olabilir mi??
6 ปีที่แล้ว +4
abstract sınıf içerisinde abstract elemanlar, ilgili sınıftan türetilen tüm sınıflara uygulatılacağından dolayı public olmak zorundadır. Protected elemanlar; tanımlandığı sınıf içerisinden ve tanımlandığı sınıftan türeyen elemanlardan erişilebilir olacağından dolayı abstract elemanlar için teoride mümkün olacaktır. Pratikte olayı değerlendirirsek eğer; abstract class MyAbstractClass { public abstract void X(); abstract public int Y(); protected abstract bool Z(); abstract protected decimal N(); } Yukarıdaki abstract classı tanımlarsanız eğer herhangi bir hatayla karşılaşmayacaksınız. class MyClass : MyAbstractClass { public override void X() => Console.WriteLine("X"); public override int Y() => -1; protected override decimal N() => -1.0m; protected override bool Z() => false; } Hatta kullandığınız zaman varsayılan olarak aynı erişim belirleyicisi ile implemente edilecektir. Uzun lafın kısası; herhangi bir abstract elemanın erişim belirleyicisi protected olabilir.
Bir şeyi yeni öğrenenler için örneklerle ve sade anlatımla bilgi aktarılmalıdır. Diğer videoların çoğunda bu yoktu. Burda farklı cümlelerle defalarca yalınlaştırılarak anlatılan sade bir anlatım var. Java öğrenmeye çalışırken bu videodan yararlanmam çaresizliğimi anlatıyor çünkü bu C#. Tebrikler.
Anlatım şekliniz çok güzel düşünmeden, ıııılamadan, madde madde ve hiç durmadan seri bir şekilde önemli noktalarda vurgu yaparak anlatıyorsunuz. Udemy den ücreti karşılığı aldığım eğitim setinden konuyu anlamadığım için videonuzu buldum ve bir defada anladım. Çok teşekkür ederim.
Hocam abstract konusu iş görüşmelerinde sorulunca kafamda yatmadığı için ezbere cevaplayamıyordum. Sayenizde kafama yattı çok güzel anlatabilir hale geldim. Çok teşekkürler.
Ben java ogreniyorum.2 haftadir abstract classin ne oldugunu anlayamadim.cok video izledim makale okudum ama faydasi olmadi.Bu videoyu 1 kere izledim cok iyi anladim.Muthis anlatmishsiniz hocam.Emegine saglik....
OOP oynatma listesinde bu ve interface eksikti, başka kaynaklardan bakayım derken yine Gençay Hoca'ya denk gelmek keyiflendirdi :D
Bu eski video.
@ farkındayım Hocam.
Emeğine sağlık, gerçekten çok basit ama açıklayıcı bir anlatım olmuş. Teşekkür ederim
Gerçekten süper anlatım Hocam. Teşekkürler.
Süper Süper. Allah razı olsun.
Teşekkürler video belirtildiği gibi, abstract öğrenilince polimorfizm pekişti
Teşekkürler hocam
Elinize sağlık
Hocam
Geçmiş videolarda siyah arkaplanda hiçbir şey okunmuyor, gözü yoruyor, insanın içini karartıyordu, beyaz ekranda yazılar rahat okunuyor, güneş doğmuş, bahar gelmiş gibi oldu.
Hocam tek seferde anladım teşekkür ederim.
Hocam Abstract Class ile nesne modelleme yapmak mümkün müdür?
hocam peki abstract sınıfdaki abstract olmayan metodların gövdesini abstract sınıfta yazabilir miyiz?
emegin icin tesekkurler
Ne işe yaradığını da anlatsanız güzel olurdu. Yani neden bunu kullanayım amacım nedir ? Normal bir class içine metod oluştururum yine aynı görür değil mi ?
Abstract class ya da interface kullanılması gerektiği yerde kendisini belli ediyor aslında ama bunu farketmek biraz zor. Bir örnek vererek neden kullanıldığını anlatacağım. En azından ben bu şekilde kullanıyorum. Mesela süt ve yoğurt olmak üzere iki farklı ürünüm var. Bu ürünleri temsil eden süt ve yogurt adında iki adet classım olsun. Bu iki ürünü veri tabanına eklemek istiyorum. Interface, abstract class vs bilmediğim zamanlarda şu şekilde yapardım. Her iki classın içine de add() diye bir method oluştururdum ve sonra o classın bilgilerini veritabanına eklerdim. Dezavantajlarım ne olurdu ? Birincisi veritabanına alakasız bir classtan erişim sağlamış olurdum. Kodlarım kendini tekrar ederdi. Çünkü hem süt classında hem de yoğurt classında aynı add methodunu kullanırdım. Ve gelecekte yeni bir ürün daha eklediğimde o ürün içinde bu add() methodunu import ederdim. Böylece kodum karma karışık bir hal alırdı. İkinci bir yol olarak databaseHelper diye bir class oluştururdum ve add methodunu sadece bu classın içinde yazardım. Ve bu methoda hem süt hem de yogurt nesnesini gönderebilmek için methodu override ederdim.. Methodun içinde ise if bloklarıyla iki nesneyi birbirinden ayırır if suistimali yapmış olurdum ki bu da zamanla çok karışık bir hale gelirdi. Peki bu problemi nasıl daha verimli bir şekilde çözebilirim ? Cevap abstract class ya da interface kullanmak. Böylece veritabanına eklenecek olan süt, yoğurt gibi nesnelerin claslarında abstract methodu implement edebiliriz. Artık abstract classımız süt ve yoğurt nesnelerinin referansını tutabilir. Yani add methoduna doğrudan abstract class nesnesi gönderebilirim. Böylece gerekli işlemleri içeride yapabiliriz.
abstract class VeritabanıNesnesi{
// şimdilik bir şey yazmaya gerek yok.
}
class süt : VeritabanıNesnesi{
String type = "süt";
public void getType(){
return type;
}
}
class yogurt : VeritabanıNesnesi {
String type = "yogurt";
public void getType(){
return type;
}
}
// DatabaseHelper diye bir classın içinde add() methodu olduğunu varsayarsak
public void add(VeritabanıNesnesi nesne){
// nesne.getType() tablosuna gelen nesneyi ekleme işlemleri burada yapılır. Süt ya da yoğurt göndermiş olmanız farketmez.
}
Umarım anlaşılır anlatabilmişimdir. İyi çalışmalar.
@@isaduvan9824 Özetle kodların karışmasını engellemek ve pratik olarak yazılımı geliştirmek için yani?
@@4lchemisttyondaime617 Evet :)
Merhabalar hocam ,Abstract Class'dan instance alamıyorsak, Abstract Class'ın default constructor'ı neden var? İyi günler...
Güzel soru.
Aşağıdaki örneği ele alarak konuşalım.
abstract class X
{
public X(int a) => Console.WriteLine($"Abstract class constroctor tetiklendi. Değer : {a}");
}
class Y : X
{
public Y() : base(1) => Console.WriteLine($"Normal class constroctor tetiklendi.");
public Y(int a) : base(a) => Console.WriteLine($"Normal class constroctor tetiklendi. Değer : {a}");
}
"X" abstract class'ı bir soyut sınıf. "Y" classı ise normal bir sınıftır. Dikkat ederseniz "X" abstract classı içerisinde bir constructor tanımlanmıştır. İşte burada kafalar karışıyor ve "Nesne oluşturulamayan bir sınıfta neden constructor tanımlanabiliyor?" sorusu akıllara geliyor. Aslında bu sorunun cevabı oldukça basittir.
Somut sınıfta tanımlanan constructorlar kendilerini uygulayan alt sınıflara bir imza, şablon teşkil etmektedirler. Bunun yanında interface yapılarından farklı olarak, soyut sınıflardan her ne kadar nesne oluşturulamasada miras alacağı sınıfların imzaları dışında normal metot, property vs. gibi değerleride içlerinde barındırabilmektedirler ve bu yapıları miras alan sınıfın nesnesi üzerinde çalıştırmaktadırlar.
Soyut sınıflar bu özellikleriyle birlikte içerisindeki birçok işlemde faydalanabilmemiz için alt sınıfın constructorından "base" keywordü ile çağrılmak ve gerekli parametreleri göndermek koşuluyla constructor yapılarınada izin vermektedir.
Tüm bunların yanında abstract class yapılarında direkt olarak "new" keywordü ile nesne oluşturulamadığı için zaten içerisindeki constructorlar doğal olarak onu miras alan sınıflar tarafından yukarıda bahsedildiği gibi abstract class içerisindeki gerekli öncelikli işlemleri sağlayabilmek için constructorları tarafından tetiklenmektedirler.
Yukarıdaki örneği değerlendirmek için aşağıdaki kodla beraber projeyi derleyip çalıştırırsanız eğer;
static void Main(string[] args)
{
X x = new Y(3);
Console.Read();
}
"Abstract class constroctor tetiklendi. Değer : 3
Normal class constroctor tetiklendi. Değer : 3"
sonucuyla karşılaşacaksınız.
Eğer ki gerçekten constructor'ın kullanılamayacağı bir sınıf yapısı görmek istiyorsanız static sınıflara göz atmanızı öneririm. Static olarak tanımlanan sınıflar belleğin static bölümünde tutulan memberlara sahiplerdir ve sade ve sadece sınıf isimleri tarafından bu elemanlara ulaşılabilmektedir. Static sınıflardan miras alınamayacağı için nesne oluşturmaksızın bu sınıflar kullanılabilmektedir.
static class Z
{
public Z()
{
}
}
Haliyle yukarıdaki "Z" isimli static sınıfının "kesinlikle" bir nesnesi olamayacağından dolayı ne varsayılan ne de kendi oluşturduğumuz bir constructorı olamayacaktır. Eee haliyle yukarıdaki tanımlamada constructor yanlıştır ve hata verecektir.
Sevgilerimle...
Cevaba ek olarak;
Eğer ki abstract class içerisindeki constructor parametresiz ya da default ise bir önceki verdiğim cevaptaki mantığın geçerli olmasıyla birlikte sadece alt sınıf constructorı tarafından "base" keywordü ile çağrılma mecburiyetinin olmamasıda söz konusu olmaktadır. Çünkü "base" keywordü, base classın default constructorı dışında manuel oluşturduğumuz birden fazla parametresiz ve parametreli constructorına erişimimizi sağlamakta, aksi taktirde varsayılan olarak default yahut parametresiz constructorı göstermektedir.
Sevgiler.
Geri dönüşünüz için çok teşekkür ederim.Anlaşılır,açıklayıcı bir cevap olmuş.Abstract Class
'ın base class olmak için yaratıldığını varsayarsak gerekiyor sanırım.Dün "Instance alınamayan bir class'ın neden Ctor'u olur .Çok saçma!" diye düşünüyordum.
Aslın da olayımız instance alıp alamamaktan ziyade,Abstract Class'ın miras için tasarlanmış olması ve miras verecek olan bir yapının içersinde ctor olmaması çok saçma olurmuş, diye düşünüyorum yani :) Olayın özünü doğru kavraya bildim mi bilemiyorum. Bayramınız şimdiden kutlu olsun.Sevgiler...
Code Behind Harikasınız... sizinde bayramınız mübarek olsun. Teşekkürler.
Sevgiler.
abstract sınıf içersinde herhangi bir abstract elemanın erişim belirleyicisi protected olabilir mi??
abstract sınıf içerisinde abstract elemanlar, ilgili sınıftan türetilen tüm sınıflara uygulatılacağından dolayı public olmak zorundadır. Protected elemanlar; tanımlandığı sınıf içerisinden ve tanımlandığı sınıftan türeyen elemanlardan erişilebilir olacağından dolayı abstract elemanlar için teoride mümkün olacaktır.
Pratikte olayı değerlendirirsek eğer;
abstract class MyAbstractClass
{
public abstract void X();
abstract public int Y();
protected abstract bool Z();
abstract protected decimal N();
}
Yukarıdaki abstract classı tanımlarsanız eğer herhangi bir hatayla karşılaşmayacaksınız.
class MyClass : MyAbstractClass
{
public override void X() => Console.WriteLine("X");
public override int Y() => -1;
protected override decimal N() => -1.0m;
protected override bool Z() => false;
}
Hatta kullandığınız zaman varsayılan olarak aynı erişim belirleyicisi ile implemente edilecektir.
Uzun lafın kısası;
herhangi bir abstract elemanın erişim belirleyicisi protected olabilir.