Derived class

From: Coskun SUNALI
Sent: Friday, March 10, 2006 2:00 PM
To: ‘Murat Yalçin’
Cc: ‘teknik@sitebuilders.org’
Subject: RE: [Teknik] Derived class

Selam,
Ilk sorunuza cevap vermeyi unutmusum, ozur dilerim.
Default olarak “internal” isaretli olduklari konusunda haklisiniz. Fakat daha once de soyledigim gibi, A class’i internal olarak isaretliyken, A class’indan turetilen B class’ini “public” yapmak gibi bir luksunuz yok.
Bunun bir cozumu yok mu derseniz, tabi ki var.
A class’ini public yapin, Ama icerisindeki “constructor” method’unu (ve ya methodlarini) “protected” olarak tanimlayin.
Boylece diger assembly’lerin Anaclass sinifini turetmek gibi bir sansi olmasin.
Ornek olarak asagidaki kodu baz alabilirsiniz;

public class Anaclass
{
protected Anaclass()
{
}
public void Islem1()
{
this.Islem2();
}
public virtual void Islem2()
{
MessageBox.Show( “Anaclass.Islem2()” );
}
}
Iyi calismalar,
Coskun SUNALI
http://sunali.com



From: teknik-owner@sitebuilders.org [mailto:teknik-owner@sitebuilders.org] On Behalf Of Coskun SUNALI
Sent: Friday, March 10, 2006 1:59 PM
To: ‘Murat Yalçin’
Cc: Sitebuilders Teknik Liste
Subject: RE: [Teknik] Derived class

Selam,
Sorulara sadece teknik grup kapsaminda yanit vermeye calistigim icin teknik gruba da CC’liyorum. Umarim anlayisla karsilarsiniz.
Oncelikle 2. sorunuza cevap vereyim.
C#’ta (ayni zamanda VB’de), polymorphism (cok sekillilik) geregi “this” kelimesi ile erisilen obje AnaClass ve ye TuremisClass olabilir.
Söyle ki, eger az sonra verecegim kodu su sekilde calistirirsaniz;
Anaclass m_Anaclass = new Anaclass();
m_Anaclass.Islem1();
Alacaginiz sonuc “Anaclass.Islem2()” olacaktir.
Fakat kodu su sekilde calistirirsaniz;
Turemisclass m_Turemisclass = new Turemisclass();
m_Turemisclass.Islem1();
Alacaginiz sonuc “Anaclass.Islem2()” ve sonrasinda da “Turemisclass.Islem2()” olacaktir.
Kod ise su sekilde;
public class Anaclass
{
public void Islem1()
{
this.Islem2();
}
public virtual void Islem2()
{
MessageBox.Show( “Anaclass.Islem2()” );
}
}
public class Turemisclass : Anaclass
{
public override void Islem2()
{
base.Islem2();
MessageBox.Show( “Turemisclass.Islem2()” );
}
}
private void Form1_Load(object sender, EventArgs e)
{
Turemisclass m_Turemisclass = new Turemisclass();
m_Turemisclass.Islem1();
}
Aslinda ilk onemli olan nokta “Anaclass” icerisindeki “Islem1” methodu icinde. Burada cagirdigimiz “Islem2” methodu, eger override edilmisse override edilmis halini, edilmemisse “Anaclass” icerisindeki halini exec ediyor.
Ikinci onemli nokta ise “Turemisclass” icerisindeki “base.Islem2()” cumlesi. Eger turemis bir class icerisinde turetildigi class’in bir ozelligini override ederseniz ve turetildigi class’daki ayni methodun yine de cagirilmasini isterseniz, “base” objesi ana class’a erismenize izin veriyor. Bu sekilde de ana class icerisindeki asil method’u cagirabiliyorsunuz.
Iyi calismalar,
Coskun SUNALI
http://sunali.com



From: Murat Yalçin
Sent: Friday, March 10, 2006 8:27 PM
To: Coskun SUNALI
Subject: Re: [Teknik] Derived class

Coşkun Bey cevaplarınız için teşekkür ederim.
bu konuda siz yardımcı olabilirsiniz diye size mail yazdım.

Birincisi aşağıdaki sorunun cevabını anlamadım. Diyelim ki A isminde base class ve B isminde A’dan türemiş bir class olsun. Bu ikisi aynı namespace içinde.
bunlar default olarak internal işaretlidir değl mi.
Ben dışardan sadece B’ye erişilsin istiyorum. Bunun için A’yı kendi halinde bırakıp B’yi public yapmak istiyorum. Bunu nasıl başarabilirim.

İkinci sorum da VB.NET tarafında kullandığımız MyClass’ın C# ta karşılığı yok sanırım. aşağıdaki örneği C# tarafında yapmam gerekiyor.
Istediğimiz şu; AnaClass içindeki Islem1 metodu hem base hem de derived classtaki Islem2’yi çalıştıracak.

Public Class AnaClass
Public Sub Islem1()
Me.Islem2()
MyClass.Islem2()
End Sub
Public Overridable Sub Islem2()
MsgBox(“AnaClass.Islem2”)
End Sub
End Class

Public Class TuremisClass
Inherits AnaClass
Public Overrides Sub Islem2()
MsgBox(“TuremisClass.Method2”)
End Sub
End Class
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim myObject As New TuremisClass
myObject.Islem1()
End Sub

bu konularda bilgilerinizi rica ederim.

—– Original Message —–
From: Coskun SUNALI
To: teknik@sitebuilders.org
Sent: Wednesday, March 08, 2006 2:11 AM
Subject: RE: [Teknik] Derived class
Selam,
Bu sadece A sinifinizin public olmamasindan kaynaklanir. A sinifinizi “private” yapip, B sinifinizi A sinifindan turettikten sonra “public” yapmak gibi bir luksunuz yoktur.
Iyi calismalar,
Coskun SUNALI
http://sunali.com


From: teknik-owner@sitebuilders.org [mailto:teknik-owner@sitebuilders.org] On Behalf Of Murat Yalçin
Sent: Wednesday, March 08, 2006 9:50 AM
To: teknik@sitebuilders.org
Subject: [Teknik] Derived class

Merhaba,

C#’ta A isimli sınıftan B isimli sınıfı türetmeye çalışırken B sınıfının public olamayacağını söylüyor.

Bunun ilgili araştırma yaptım gerçekten C#’ta türetilen sınıfın public olarak tanıtılmasına izin vermiyor.

Neden izin vermiyor, bu sınıf public olmazsa başka yerlerde nasıl kullanacağım.

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *