Karalama Defteri - Karalamalar SZP.net 4.1 Beta  
Sınıflarda Kalıtım (Inheritance) Kavramı
ASP.net miras, taban sınıf, türemiş sınıf, inherit, inheritance, base class, derived class

.NET çatısı altında OOP´un asıl amacı kodun bir kez yazıldıktan sonra sınıf haline getirilerek bir aduzayı hiyerarşisi içinde tasnif edilmesi ve gerektiğinde nesne türetilerek tekrar tekrar kullanılabilmesini sağlamaktır. Ancak, mevcut sınıfın yordam ve özellikleri yetersiz ise bu sınıftan sadece nesne türetebiliyor olması yeterli olamaz. Eğer bütün sınıfların kodu açık olsaydı kod üzerinde istediğimiz değişiklikleri yapabilir ve sınıfları geliştirebilirdik. Böyle bir imkan olmadığından, bu duruma iyi bir çözüm bulmak adına Inheritance yapısı geliştirilmiştir. Bu yapı ile bir sınıfın yordam ve özelliklerini miras alan, geliştiren ve/veya değiştiren yeni bir sınıf yazmak mümkündür.

Eğer karmaşık matematik işlemleri yapan bir sınıf yazmak istiyorsanız temel matematik işlemleri için gerekli kodları tekrar yazmak yerine zaten bu işleri yapan bir sınıftan yeni yazacağınız sınıfa gerekli yordam ve özellikleri miras yoluyla alabilirsiniz.
Burada kaynak olan, kendisinin yordam ve özeliklerini alacağımız sınıfa taban sınıf (base class) denir. Özellikleri edinen yeni sınıfa ise türemiş sınıf (derived class) denir. Aslında türemiş sınıf yerine mirascı sınıf denmesi -türetme- fiilinin nesne türetme içinde kullanılıyor olması sebebiyle karışıklık olmaması için daha doğru olmaktadır. Taban sınıftan türemiş sınıfa miras olarak alınan bazı yordamları ve/veya özellikleri beğenmediğimizde bunların yerine yenilerini yazabiliriz. Buna ezmek (overriding) denir.

Frank DERFLER´in 95´lerde okuduğum ağlar (network) hakkındaki bir kitabının bölüm aralarındaki teknik hikayeleri severdim. Bu hikayeler konunun anlaşılmasını kolaylaştırıyordu. Hikaye anlatacak değilim ama konuya en azından bir örnek verebilirim.

Marangoz (Mustafa Ustamı rahmetle anıyorum) ustasının çırağına neyi nasıl yapacağını öğretmesi en iyi mirasıdır. Yani usta-çırak ilişkisi ile öğrenmede miras yoluyla geçiş sözkonusudur. Çırak ustasından yol-yordam (method), öğrenir, alet kullanama becerisini alır. Ancak temel bilgileri sabit kalarak, yeni aletler ve zamana göre zevklerin değişmesi ile çırak, ustasından öğrendiği bazı usüllerin yerine yenilerini geliştirebilir. Burada miras yoluyla geçişe Inheritance, alınan bazı yordamların ihtiyaca göre değiştirilmesine Overriding denir.

Konuyu derinleştirmeden önce üç ayrı sınıf türünün özelliklerine kısaca değinmek yerinde olacaktır.

Arabirim Sınıflar (Interface Class)
Miras alınabilir, taban sınıf olabilir, nesne türetilebilir

Bu sınıflardan hem nesne türetmek mümkündür, hemde bu sınıflar başka sınıfların yazılmasında miras alınabilir, yani taban sınıf olabilirler.

Public Class TemelMatematik
    Public Function KareAl(piX As Integer) As Integer
        Return piX * piX
    End Function
End Class


TemelMatematik sınıfını miras alma
Public Class IleriMatematik
    Inherits TemelMatematik
End Class


TemelMatematik sınıfından nesne türetme
Public Class Matematik
    Dim T As New TemelMatematik()
End Class


Somut Sınıflar (Concrete Class)
NotInheritable: Miras alınamaz, taban sınıf olamaz, sadece nesne türetilebilir

Bazı sınıflar sadece nesne türetilerek kullanılması amacıyla yazılırlar. Yazılırken bu sınıfın olgun olduğu ve miras alınarak geliştirilmesinin gerekmeyeceği düşünülür. Bu sınıflar başka sınıflara taban sınıf olamaz. NotInheritable anahtar kelimesi ile tanımlanırlar.

Public Class IleriMatematik
    Inherits TemelMatematik
End Class


Yukarıda Arabirim Sınıflar´dan bahsederken kodunu yazdığımız arabirim sınıf türündeki TemelMatematik sınıfının yordamları ve özellikleri (gerçi sadece bir tane var) IleriMatematik sınıfı tarafından miras alınmıştır.

Eğer TemelMatematik sınıfını aşağıdaki gibi NotInheritable anahtar kelimesi ile yazıp somut bir sınıf yapsaydık miras alınamazdı.

Bu sınıf miras alınamaz
Public NotInheritable Class TemelMatematik
    Public Function KareAl(piX As Integer) As Integer
        Return piX * piX
    End Function
End Class


Hemen üstteki sınıf miras alınamaz. Aşağıdaki yazım yanlıştır.
Inherits TemelMatematik

Ama bu sınıftan nesne türetilebilir. Aşağıdaki yazım doğrudur.
Dim T As New TemelMatematik

Soyut Sınıflar (Abstract Class)
MustInherit: Mutlaka miras alınmalıdır, taban sınıf olur, nesne türetilemez

Bazı sınıflar en temel işlemleri barındırırlar ve kendi başlarına karmaşık işlemler yazmazlar. Bu sınıflar yazılırken mutlaka başka bir sınıf tarafından miras alınacakları ve daha gelişmiş yordamların yazılmasında yardımcı olacakları düşünülür. Bu sınıflara Soyut Sınıflar (Abstract Class) denir. Yani bu sınıfın yegane amacı başka sınıflara taban sınıf olmaktır. Bu sınıfdan New kelimesi ile nesne türetilemez. MustInherit anahtar kelimesi ile tanımlanırlar.

Bu sınıf mutlaka miras alınmalıdır. Nesne türetilemez.
Public MustInherit Class TemelMatematik
    Public Function KareAl(piX As Integer) As Integer
        Return piX * piX
    End Function
End Class


Hemen üstteki sınıf miras alınabilir. Aşağıdaki yazım doğrudur.
Inherits TemelMatematik

Bu sınıftan nesne türetilemez. Aşağıdaki .
Dim T As New TemelMatematik

----------------------------------------------------------------------

Özetle;
Arabirim (Interface) Sınıflar
    Anahtar kelime kullanılmadan yazılan sınıflar
    Nesne türetilir, miras alınır.

Somut (Concrete) Sınıflar
    NotInheritable anahtar kelimesi ile yazılan sınıflar
    Nesne türetilir, miras alınmaz.

Soyut (Abstract) Sınıflar
    MustInherit anahtar kelimesi ile yazılan sınıflar
    Nesne türetilemez, miras alınır.

Bu durumda asıl konumuz olan Sınıflarda Kalıtım (Inheritance) için ele alacağımız sınıflar arabirim ve soyut sınıflar olacaktır.

----------------------------------------------------------------------

Şimdi daha sonra yazacağımız sınıflarda miras alınmak üzere bir arabirim sınıf yazalım.

Imports System

Namespace Matematik
    Public Class TabanSinif
        Public Function Topla(piS1 As Integer, piS2 As Integer) As Integer
            Return piS1 + piS2
        End Function
        
        Public Function Cikar(piS1 As Integer, piS2 As Integer) As Integer
            Return piS1 - piS2
        End Function
        
        Public Function Carp(piS1 As Integer, piS2 As Integer) As Integer
            Return piS1 * piS2
        End Function
        
        Public Function Bol(piS1 As Integer, piS2 As Integer) As Integer
            Return piS1 / piS2
        End Function
        
        Public Overridable Function Kare(piS1 As Integer) As Integer
            Return piS1 * piS1
        End Function
    End Class
End NameSpace


Anlaşılacağı üzere bu sınıfımız bazı temel matemetik işlemlerini yapıyor. Şimdi bu sınıfı taban sınıf olarak kullanan başka bir sınıf yazalım.

Imports System

Namespace Matematik
    Public Class MirasciSinif
        Imports TabanSinif
        
        Public Function Kup(piS1 As Integer) As Integer
            Return piS1 ^ 3
        End Function
        
        Public Overrides Function Kare(piS1 As Integer) As Integer
            Return piS1 ^ 2
        End Function
    End Class
End NameSpace


Bu sınıf yukarıda kodunu yazdığım TabanSinif´ı miras olarak alıyor. Şimdi bu sınıf TabanSinif´ın bütün fonksiyonlarına sahiptir. Yani aşağıdaki yazım doğrudur;

Dim Nesne As New MirasciSinif()
Nesne.Carp(3,2)


Burada MirasciSinif Carp fonksiyonunun kodunu taşımamaktadır ama TabanSinif´tan miras olarak almıştır.
Hatta TabanSinif´tan miras olan fonksiyonları eksik gördüğümüz için birde Kup fonksiyonu eklenmiştir. Bu fonksiyon verilen sayının küpünü alıyor.


MirasciSinif´ın son fonksiyonu olan Kare ise daha ilginçtir. Çünkü bu isimde bir fonksiyon zaten TabanSinif´ta vardı ve miras olarak gelmişti. Ancak bu fonsiyon sayıyı kendi ile çarparak (piS1 * piS1) karesini aldığında bunu beğenmedim ve yerine sayının 2 üssünü doğrudan alan (piS1 ^ 2) yeni bir fonksiyon yazdım. İşte yeni yazdığımız fonksiyon miras gelenin üstüne biner, buna ezmek (overriding) denir. TabanSinif´ın kodunda sondaki Kare fonksiyonunun yazılışına dikkat edin Overridable (ezilebilir) anahtar kelimesini göreceksiniz. Bir yordamın ezilebilmesi için Overridable (ezilebilir) anahtar kelimesi ile tanımlanması gerekir. Bu yordamı ezen yordamın ise Overrides (ezici) anahtar kelimesi ile tanımlanması gerekir.

MirasciSinif´ın içerisinde bir yerden fonskiyonun Overriding edilmemiş aslına yani TabanSinif´ın içindeki haline erişilmek istenirse MyBase.Kare(sayi) yazımı kullanılır.

----------------------------------------------------------------------

Fonksiyonların ve değişkenlerin Public, Friend, Protected, Private anahtar kelimeleri ile tanımlanabildiğini biliyoruz.

Taban sınıfta Public olarak tanımlanan öğeye;
    Mirascı sınıftan erişilir.
    Mirascı sınıftan türetilen nesneden erişilir.

Taban sınıfta Friend olarak tanımlanan öğeye;
    Mirascı sınıftan erişilir.
    Mirascı sınıftan türetilen nesneden erişilir.

Taban sınıfta Protected olarak tanımlanan öğeye;
    Mirascı sınıftan erişilir.
    Mirascı sınıftan türetilen nesneden erişilmez.

Taban sınıfta Private olarak tanımlanan öğeye;
    Mirascı sınıftan erişilmez.
    Mirascı sınıftan türetilen nesneden erişilmez.

Elbette Inheritance kavramı bu kadarla bitmiyor. Hem konuyu pekiştirmek hemde anlamak için diğer makalelerimi okumanızı tavsiye ederim.

Bu yazı kaynak göstermek kaydıyla kısmen, tamamen veya değiştirilerek yayınlanabilir.
En yeni makaleler FındıkKurdu'nda yayınlanır. http://www.findikkurdu.com

Kolay gelsin. Bir sonraki makaleye kadar esen kalın.

ufukyayla 24.10.2005 10:05:12 Yorumlar [0]



Aduzayı Kavramı, Nesnelerin Yapılandırıcıları ve Nesnelerin Özellikleri
ASP.net aduzayı, nesne, yapılandırıcı, özellik, namespace, class, constructor, property

Bu makale Nesneye Yönelik Programlamanın temel taşları olan nesne (Class) lerin yapılandırıcılarını ve özelliklerini (properties) anlatır. Ayrıca aduzayı kavramına kısaca değinilmiştir.

Aduzayı (Namespace)

.NET çatısı altında hazır olarak gelen binlerce sınıf vardır. Ayrıca biz de kendi sınıflarımızı yazabilmekteyiz. Bütün bu sınıfların karışmaması için iyi tasnif edilmeleri gereklidir. Aynı adı taşımakla beraber farklı işlere yarayan sınıflar vardır. Örneğin TextBox sınıfı System.Web.UI.WebControls aduzayında hem de System.Windows.Forms aduzayında vardır. Bunlardan System.Web.UI.WebControls.TextBox ASP.NET'de web sayfalarında kullandığımız metin kutuları diğeri olan System.Windows.Forms.TextBox ise standart (.exe) uygulamalarda kullandığımız metin kutularıdır. Farklı aduzayı içinde oldukları için birbirlerinden ayırt edilebilirler. Bu durumda bu sınıfların karışmaması için aduzaylarının kullanılması bir zorunluluktur.

Bir nesneyi türetirken nesneyi türeteceğimiz sınıfın bir anlamda tam adresini vermek gerekir.

Dim Baslik As New System.Web.UI.WebControls.TextBox()

Bu kodda görüldüğü gibi Baslik nesne System.Web.UI.WebControls aduzayı içindeki TextBox sınıfından türetilecektir. Sınıfı, bulunduğu aduzayı ile beraber yazmak pratik değildir. Bu durumda kullanacağımız aduzaylarını ASP.NET sayfamızın başında belirtiriz.

Imports System.Web.HTTPContext
veya;
<%@ Import Namespace="System.Web.HTTPContext" %>

Bu belirtme yapıldıktan sonra nesneyi türetmek için;
Dim Baslik As New TextBox
yazmak yeterli olacaktır.

Yapılandırıcı (Constructor)

Bir sınıftan yeni bir nesne türettiğimizde nesnenin bazı varsayılan değerleri yüklemesi, hazırlık işlemlerini yapması gerekebilir. Ya da biz bir nesnenin bazı özelliklerini daha türetme aşamasında iken belirlemek isteyebiliriz. İşte bu iş için nesne türetildiğinde hemen çalışan özel bir yordam yazılır. Bu yordam VB'de New() adını taşır; C#'da ise sınıfla aynı addadır, yani sınıfın adı Temel ise yapılandırıcısının adı da Temel olur.

Sınıf, Nesne, Nesneye Yönelik Programlama adlı makalemde kodunu verdiğim örnek sınıfın bir yapılandırıcısı vardı. Bu sınıftan bir nesne türetildiğinde ilk olarak bu (kodu aşağıda olan) yordam çalışmakta ve bazı ayarlamalar yapmaktaydı. Yapılacak matematik işlemini toplama, ilk sayıyı 4 ve ikinci sayıyı 2 olarak belirleyip sonucu hesaplıyordu.

Public Sub New()
    csIslem = "+"
    ciSayi1 = 4
    ciSayi2 = 2
    Hesapla()
End Sub


Bir nesne türetildiğinde veya nesne tanımlandıktan sonra kendisine New anahtar kelimesi ile yeni bir nesne referansı atandığında ilgili sınıfın yapılandırıcısı çalışır.

Dim Hesap As New Matematik.Temel()
veya;
Dim Hesap As Matematik.Temel
Hesap = New Matematik.Temel()


Her iki durumda da sınıfın kodu içinde bulunan New() yordamı çalışacaktır. Bu yordam Temel adlı sınıfın yapılandırıcısıdır. Bütün yapılandırıcılar VB'de New() adını taşır, C#'da ise sınıfla aynı addadır. Yapılandırıcı yordamı da adı üstünde bir yordamdır ve diğer yordamlar gibi farklı overload halleri olabilir.

Overload Yordamlar ve Overloading Kavramı adlı makalemde overloading konusundan bahsetmiş ve örnek olarak OleDBCommand sınıfının yapınlandırıcısını (constructor) vermiştim. Ardından temel matematik işlemlerini yapan bir sınıfı örnek vererek overloding kavramını anlatmıştım. Overloding kavramını için bu makaleyi tekrar okuyunuz.
Örneğin OleDBCommand nesnesinin yapılandırıcısının (yapılandırıcı, constructor) dört farklı overload hali vardır.

OleDBCommand()
OleDBCommand(cmdText)
OleDBCommand(cmdText, Connection)
OleDBCommand(cmdText, Connection, Transaction)


Bu yordamların hepsi aynı adı taşımakla beraber çağrılırken kullanılan parametre sayısına ve türüne göre birbirlerinden ayırt edilirler.

Özellikler (Propeties)

Nesnelerin özellikleri vardır. Tabiatta gördüğümüz her cismin, her nesnenin renk, boy, en, ağırlık gibi özellikleri olduğu gibi .NET çatısı altında programlamada kullandığımız nesnelerin de özellikleri vardır. Özellikler nesnelerin kendilerine verilen işleri nasıl yapacaklarını ele aldıkları veriye göre nasıl davranacaklarını belirler.
Yine Sınıf, Nesne, Nesneye Yönelik Programlama adlı makalemde kodunu verdiğim Temel adlı sınıfın 4 adet özelliği vardı. Aşağıda bunlardan biri olan Islem adlı özelliğin kodunu görmektesiniz.

Public Property Islem() As String
    Get
        Return csIslem
    End Get
    Set(Value As String)
        csIslem = Value
    End Set
End Property


Bu özelliğe "+", "-", "*" veya "/" atanarak yapılacak işlem türü belirleniyordu. Burada Islem özelliği Get ve Set adlı iki kısımdan oluştuğundan hep yazılabilir hemde okunabilir durumdadır. Yani Temel.Islem="+" yazarak yapılacak işlemi toplama olarak belirleyebilir ya da If Temel.Islem="+" Then ... yazarak işlemin ne olduğunu okuyabiliriz. Ancak bazı durumlarda bir özelliğin sadece okunur (ReadOnly) olmasını, değiştirilememesini isteyebiliriz. Temel adlı sınıfın Sonuc özelliği böyle bir özelliktir. Sonucun dışarıdan atama yapılarak değiştirilmesi doğru olmaz. Sonuc sadece okunabilir olmalıdır.

Public ReadOnly Property Sonuc() As Integer
    Get
        Return ciSonuc
    End Get
End Property


Görüldüğü gibi sadece Get kısmı vardır. Ayrıca özellik tanımlanırken ReadOnly anahtar kelimesi kullanılmıştır.

Birde sadece atanabilen ve sonradan okunamayan (WriteOnly) özellikler vardır. Örneğin yukarıda kodu görülen Islem özelliğini sadece yazılabilir biçimde yazalım.

Public WriteOnly Property Islem() As String
    Set(Value As String)
        csIslem = Value
    End Set
End Property


Bu özellik sadece yazılabilir olduğundan Get kısmı yoktur.

Özellikleri tanımlarken sınıfın içindeki komutlar yanında dışarıdanda erişilebilmesi için Public anahtar kelimesi ile tanımlamak gereklidir. Ayrıca özelliğe bağlı olarak uygun veri türü tanımlanmalıdır. Value As String gibi.

Bu yazı kaynak göstermek kaydıyla kısmen, tamamen veya değiştirilerek yayınlanabilir.
En yeni makaleler FındıkKurdu'nda yayınlanır. http://www.findikkurdu.com

Bir sonraki makalede görüşmek üzere.

ufukyayla 02.09.2005 11:15:21 Yorumlar [0]



AJAX (Asynchronous JavaScript and XML)
ASP.net ajax, javascript, XML

Bu makale AJAX'ın pratik olarak nasıl kullanılabileceğine dair bir yaklaşımı anlatır.

AJAX yani Asynchronous JavaScript And XML. Henüz adı bu olmadan önce kullandığımız ama bir ad konunca nedense daha çok ilgimizi çeken şey.

Ne işe yarıyor?

Sayfada meydana gelen her tıklamada tarayıcının yeni bir istek yaparak bütün sayfayı güncellemesi yerine sadece belli bir kısmı yüklemesini sağlayarak ağ trafiğini azaltıyor ve kullanıcı dostu bir arabirim sağlıyor.

Nasıl çalışıyor?

Tarayıcı üzerinde çalışan bir Javascript'in sayfa üzerinde meydana gelen olaylara (event: tıklama vs.) göre sunucudan istekte bulunup gelen XML veriye göre sayfayı değiştirmesi. Bu durumda JS ve DOM'u destekleyen bir tarayıcıya ihtiyacımız var. Elbette XML destekli olmaları da gerekmektedir. IE, Firefox, Opera gibi tarayıcılar bazı farklılıklar olmakla beraber bu işi yapabilmektedir.

Şimdi kullanıcının sayfanızda bir linki tıkladığını düşünün, tarayıcı hemen sunucuya yeni bir istekte bulunup bütün sayfayı yeniden yükleyecektir. Sayfanın üstünde, altında, kenarlarında bulunan bütün sabit kısımlar ve biçimlendirme kodları gibi herşeyi. Oysa sadece bir <div> içindeki metni değiştirmek istemiş olabilirsiniz. İşte AJAX buna iyi bir çözümdür. Aşağıda örneğin tarayıcı tarafında çalışan hali ve tarayıcı JavaScript kodu verilmiştir. (Bu kod basit olması için sadece IE ye uygun yazılmıştır, en altta linkini bulacağınız başka bir örnek yaygın tarayıcıların hepsinde çalışmaktadır.)

Örnek sayfa (index.htm):

<html>
<head>
<title>Ajax</title>
<meta http-equiv='content-language' content='tr' />
<meta http-equiv='content-type' content='text/html; charset=windows-1254' />
<script>
    var ajax_istek;
    
    function ajax_getir(url){
        if (ajax_istek){ajax_istek.abort()}
        else{ajax_istek=new ActiveXObject("Microsoft.XMLHTTP")}
        if (ajax_istek){
            ajax_istek.onreadystatechange=ajax_takipet;
            ajax_istek.open('get',url,true);
            ajax_istek.send(null);
        }
    }
    
    function ajax_takipet(){
        var cevapXML;
        var kimlik;
        var deger;
        
        if (ajax_istek.readyState==4){
            if (ajax_istek.status==200){
                cevapXML=ajax_istek.responseXML.documentElement;
                kimlik=cevapXML.getElementsByTagName('kimlik')[0].firstChild.data;
                deger=cevapXML.getElementsByTagName('deger')[0].firstChild.data;
                
                document.getElementById(kimlik).innerHTML=deger;
            }
        }
    }
</script>
</head>
<body>

Aşağıdan sırasıyla 1, 2, 3 gibi tıklayın.<br/><br/>
<a href="#" onclick="ajax_getir('ajax.asp?istek=1')">1</a> -
<a href="#" onclick="ajax_getir('ajax.asp?istek=2')">2</a> -
<a href="#" onclick="ajax_getir('ajax.asp?istek=3')">3</a> -
<a href="#" onclick="ajax_getir('ajax.asp?istek=4')">4</a><br/><br/>
<a href="index.htm" target="_blank">Yeni Pencerede Aç</a><br/><br/><br/><br/>

<div id="kutu1" name="kutu1" style="width:100%;height:100px;background:ffff00">&nbsp;</div><br/>
<div id="kutu2" name="kutu2" style="width:100%;height:100px;background:ff00ff">&nbsp;</div><br/>

</body>
</html>


ajax_getir fonksiyonunda oluşturulan XMLHttp isteğinin olaylarını takip etmek üzere ajax_istek.onreadystatechange=ajax_takipet; satırı ile ajax_takipet fonksiyonu atanmıştır. Yapılan istek bittiğinde ajax_istek.readyState'nin değeri 4 olacaktır. Eğer sunucu düzgün bir şekilde cevap verirse ajax_istek.status'un değeri 200 olur. Bu durumda gelen XML verisi parse edilmektedir. Gelen verinin içinden hangi <div>'in değiştirilmek istendiği ve içine konulmak istenen veri çekilir.

Sunucu tarafında çalışan kod (ajax.asp):

<%

Session.Codepage=1254
Session.LCID=1055
Response.Expires=-1

Dim Istek
Dim Kimlik
Dim Deger

Istek=Request.QueryString("istek")

Select Case Istek
    Case "1"
        Kimlik="kutu1"
        Deger="<b>AJAX için JavaScript kullanılır</b>"
    Case "2"
        Kimlik="kutu1"
        Deger="<i>Veri sunucudan XML formatında gelir</i>"
    Case "3"
        Kimlik="kutu2"
        Deger="<u>Tarayıcı tarafında XML verisi parse edilir</u>"
    Case "4"
        Kimlik="kutu2"
        Deger="<select id='sec' name='sec'>" & _
            "<option value='0'>Seçenek 1</option>" & _
            "<option value='1'>Seçenek 2</option>" & _
            "</select>"
End Select

Response.ContentType="text/xml"
Response.Write "<?xml version=""1.0"" encoding=""windows-1254"" ?>"
Response.Write "<ajax>"
    Response.Write "<nesne>"
        Response.Write "<kimlik>" & Kimlik & "</kimlik>"
        Response.Write "<deger>" & XMLMetni(Deger) & "</deger>"
    Response.Write "</nesne>"
Response.Write "</ajax>"

Function XMLMetni(psMetin)
    Dim ysMetin
    ysMetin=psMetin
    
    ysMetin=Replace(ysMetin,"&","&amp;")
    ysMetin=Replace(ysMetin,">","&gt;")
    ysMetin=Replace(ysMetin,"<","&lt;")
    ysMetin=Replace(ysMetin,"'","&apos;")
    ysMetin=Replace(ysMetin,"""","&quot;")
    
    XMLMetni=ysMetin
End Function

%>


Görüldüğü gibi asp kodu gelen isteğe göre değiştirilecek içeriği nesnenin kimlik bilgisini ve içerik metnini ayarlamakta ve XML formatında istemciye yollamaktadır. Eğer bir div içine yolladğınız veri içinde başka html kontolleri varsa onlar da görüntülecektir. 4. link buna bir örnektir.

Konu yeni olduğundan örnek kodu indirin, sunucunuzda bir dizine koyun ve index.htm dosyasını çalıştırarak sırayla 1, 2, 3 ve 4 numaralı linklere tıklayın.

Örneğe bak >> http://www.ufukyayla.com/sair/fk/ajaxornek/index.htm

Daha çaplı bir örnek ve kodu için;
http://www.ufukyayla.com/sair/ajax/deneme.aspx

Bu yazı kaynak göstermek kaydıyla kısmen, tamamen veya değiştirilerek yayınlanabilir.
En yeni makaleler FındıkKurdu'nda yayınlanır. http://www.findikkurdu.com

ufukyayla 07.08.2005 19:32:58 Yorumlar [0]



Overload Yordamlar ve Overloading Kavramı
ASP.net overload, overloading, yordam, optional, seçimlik

Daha öncen yazmış olduğum ve sınıf, nesne konularını anlatan makaleme devam niteliğinde overloading kavramını anlatmaya çalışacağım. Overloading yeni bir kavramdır, bir sınıfın içinde aynı adı taşıyan ama farklı işlemler yapan yordamların olabilmesini durumudur. Benzer işler yapan yordamlara farklı adlar vermek hem kafa karıştırıcı hem de anlamlı ad bulma zorluğu sebebiyle tamlamalı, uzun adlara sebep olur. overloading ile aynı ada sahip yordamlar yazmak mümkündür. Bu yordamlar parametre yapıları ile birbirlerinden ayrılırlar. Örneğin .NET ile beraber kullanmaya aşina olduğumuz OleDBCommand nesnesinin yapılandırıcısının (yapılandırıcı, constructor: bu konuyu sonra anlatacağım, şimdilik bunun bir yordam olduğunu bilin yeter) dört farklı overload hali vardır.

OleDBCommand()
OleDBCommand(cmdText)
OleDBCommand(cmdText, Connection)
OleDBCommand(cmdText, Connection, Transaction)


Örnek olarak basit temel matematik işlemlerini yapan bir sınıf yazıyorum. Bu sınıfın 4 farklı overload hali olacak.

Imports System

Namespace Matematik

Public Class Temel
    Public Islem As String
    Public Sayi1 As Integer
    Public Sayi2 As Integer
    
    Public Function Hesapla(piSayi1 As Integer, piSayi2 As Integer, psIslem As String)
        Sayi1=piSayi1
        Sayi2=piSayi2
        Islem=psIslem
        Return Hesapla()
    End Function
    
    Public Function Hesapla(psIslem As String)
        Islem=psIslem
        Return Hesapla()
    End Function
    
    Public Function Hesapla()
        Select Case Islem
            Case "+" : Return Sayi1 + Sayi2
            Case "-" : Return Sayi1 - Sayi2
            Case "*" : Return Sayi1 * Sayi2
            Case "/" : Return Sayi1 / Sayi2
        End Select
    End Function
    
    Public Function Hesapla(piSayi As Integer)
        Return piSayi * piSayi
    End Function
End Class

End NameSpace


Görüldüğü gibi sınıfın içinde aynı adı taşıyan  (Hesap) 4 farklı yordam var, bu yordamlardan 1.si 3 parametre, 2.si bir parametre almakta, 3.sü ise hiç parametre almamaktadır. Yine 4.sü 1 parametre almaktadır. 1., 2. ve 3. yordamlar parametre sayıları farklı olduğundan birbirlerinden ayırt edilebilmektedir. 2. ile 4. ise aldıkları parametrenin türünden (String, Integer) ayırt edilmektedir.  

Şimdi bu sınıftan bir nesne türetip yazdığımız bu yordamları kullanalım.

Public Sub Deneme()
    Dim Hesap As New Matematik.Temel()
    Dim Sonuc As Integer
    
    '1. Overload Yordam
    Sonuc=Hesap.Hesapla(10,2,"+")
    Response.Write(Sonuc.ToString)
    
    '2. Overload Yordam
    Hesap.Sayi1=10
    Hesap.Sayi2=2
    Sonuc=Hesap.Hesapla("+")
    Response.Write(Sonuc.ToString)
    
    '3. Overload Yordam
    Hesap.Sayi1=10
    Hesap.Sayi2=2
    Hesap.Islem="+"
    Sonuc=Hesap.Hesapla()
    Response.Write(Sonuc.ToString)
    
    '4. Overload Yordam
    Sonuc=Hesap.Hesapla(2)
    Response.Write(Sonuc.ToString)
End Sub


1., 2. ve 3. overload yordamların sonucuları 12'dir. 4. overload yordamın sonucu ise 4 olup 2 sayısının karesidir.

Overload yordamlar birbirlerinden parametre sayılarının ve/veya türlerinin farklı olmasıyla ayırt edilirler. Parametrelerin adlarının farklı olması bu durumun dışındadır. Yani 5. bir yordam olarak sınıf içine

Public Function Hesapla(psDeger As Integer)
    Return psDeger * psDeger
End Function


yordamını yazdığımızda hata alırız. Çünkü 4. yordamla karışmaktadır. Her ne kadar parametre adı (psDeger) 4. yordamın parametresinden (piSayi) farklı olsa da aynı sayıda (bir adet) parametre almaktadırlar ve ikisininki de Integer türündedir.

Overload yordamlar tanımlanırken Overload anahtar kelimesinin kullanılması zorunlu değildir ancak birinde kullanılırsa hepsinde kullanılmalıdır.

Seçimlik Parametreler

Bu başlık içerisinde seçimlik parametrelere de (optional parameters) değinmek yerinde olacaktır. Seçimlik parametreler yordamın çağırılmasında mutlaka kullanılması gerekmeyen parametrelerdir. Varsayılan (default) bir değer alırlar ve yordam çağırılırken belirtilmedikleri durumda varsayılan değerleri kullanılır. Örneğin;

Public Function Hesapla(piSayi1 As Integer, piSayi2 As Integer, Optional psIslem As String="+")
    Select Case psIslem
        Case "+" : Return piSayi1 + piSayi2
        Case "-" : Return piSayi1 - piSayi2
        Case "*" : Return piSayi1 * piSayi2
        Case "/" : Return piSayi1 / piSayi2
    End Select
End Function


Burada Hesapla fonksiyonu esasen 3 parametre almakla beraber yapılacak işlem türünü belirleyen psIslem parametresi seçimlik olarak tanımlanmıştır ve varsayılan olarak "+" değerini almaktadır.

Sonuc=Hesapla(10,2,"+") 12 sonucu döndürür.
Sonuc=Hesapla(10,2) 12 sonucu döndürür.

Her seçimlik parametre varsayılan değer almak zorundadır.
Yordam yazılırken seçimlik bir parametre tanımlandığında bu parametrenin sağında yer alacak diğer parametreler de seçimlik olmalıdır.
Public Function Hesapla(piSayi1 As Integer, Optional piSayi2 As Integer=2, Optional psIslem As String="+")
geçerli bir tanımlamadır.
Public Function Hesapla(piSayi1 As Integer, Optional piSayi2 As Integer=2, psIslem As String)
tanımlaması ise geçersizdir. Çünkü seçimlik olan piSayi2 parametresinin sağındaki psIslem parametresi seçimlik olarak tanımlanmamıştır.

Şimdi tekrar overload yordamlara dönelim. Overload yordamlar birbirlerinden parametre sayılarının ve/veya türlerinin farklı olmasıyla ayırt edilmektedirler. Ancak seçimlik parametreler bunun dışındadır. Bir sınıfın içinde aşağıdaki gibi tanımlanmış iki yordam olamaz;

Public Function Hesapla(piSayi1 As Integer, piSayi2 As Integer=2)
    ....
End Sub

Public Function Hesapla(piSayi1 As Integer, piSayi2 As Integer=2, Optional psIslem As String="+")
    ....
End Sub


Çünkü yordam Sonuc=Hesapla(10,2) şeklinde çağrıldığında bu overload yordamların hangisinin çalışacağı ayırt edilemez.

Kolay gelsin.

ufukyayla 06.08.2005 21:20:36 Yorumlar [0]



Dizin İçeriği Görüntüleme ve Dosya Yükleme
ASP.net dizin, dosya, yükleme, listeleme, folder, file, upload, listing

İlk önce bir dizinin içeriğini nasıl gösterebileceğimizi görelim. Önce kodu veriyorum.

dosyalar.aspx

<%@ Page Language="VB" %>

<%@ Import Namespace="System.IO" %>

<script runat="server">
Private Sub Page_Load(ByVal Sender As System.Object, ByVal E As System.EventArgs)
Dim Dizin As String=Server.Mappath("/")
Dim DizinBilgisi As New DirectoryInfo(Dizin)
Dim DosyaBilgisi As FileInfo

For Each DosyaBilgisi In DizinBilgisi.GetFiles("*.*")
Response.Write(DosyaBilgisi.Name & "<br/>")
Next

Response.Write("<form method='post' enctype='multipart/form-data' action='yukle.aspx'>")
Response.Write("<input type='file' id='dosya' name='dosya' size='40'><br/>")
Response.Write("<input type='submit' id='git' name='git' value='Yükle'>")
Response.Write("</form>")

End Sub
</script>


Dosya bilgilerini alma işlemi bir disk giriş-çıkış işlemi olduğundan kkinci satırda System.IO aduzayını import ettik.
Dim Dizin As String=Server.Mappath("/") satırında içeriğini görüntüleyeceğimiz dizini ayarlıyoruz.
Burada sunucumuzun kök dizinini seçtik. Dim Dizin As String=Server.Mappath("/") & "\dizin" şeklinde istediğimiz bir dizini de yazabilirdik.
Dim DizinBilgisi As New DirectoryInfo(Dizin) satırında DizinBilgisi adındaki nesnemize seçtiğimiz dizinin içerik bilgisini yükledik.
Bir For ... Next döngüsü ile DizinBilgisi adındaki nesnemizin içinde depolanmış olan dosya bilgilerini tek tek alarak yazdırdık.

Son kod blogunda yüklenecek dosyayı göstermemize yarayacak formu hazırladık.
Formun actionu yani düğmeye tıklandığında gideceği adres "yukle.aspx" dir.
Bu dosya gönderdiğimiz dosyayı dizine kaydedecek.

yukle.aspx

<%@ Page Language="VB" %>

<%@ Import Namespace="System.IO" %>

<script runat="server">
Private Sub Page_Load(ByVal Sender As System.Object, ByVal E As System.EventArgs)
Dim YuklemeDizini As String=Server.Mappath("/")
Dim GelenDosya As HttpPostedFile=Request.Files(0)

Dim DosyaAdi As String
Dim DosyaBilgisi As FileInfo

DosyaAdi=System.IO.Path.GetFileName(GelenDosya.FileName)

DosyaBilgisi=New FileInfo(YuklemeDizini & DosyaAdi)

If DosyaBilgisi.Exists=False Then
GelenDosya.SaveAs(YuklemeDizini & DosyaAdi)
Response.Redirect("dosyalar.aspx")
Else
Response.Write("Aynı adlı dosya zaten mevcut!<br/>")
Response.Write("<a href='dosyalar.aspx'>Geri dön</a>")
End If

End Sub
</script>


Dim YuklemeDizini As String=Server.Mappath("/") satırında yüklemenin yapılacağı dizini belirledik.
Dim GelenDosya As HttpPostedFile=Request.Files(0) satırında gelen dosya verisini GelenDosya nesnesine atadık.
DosyaAdi=System.IO.Path.GetFileName(GelenDosya.FileName) satırında gelen dosyanın adını aldık.
DosyaBilgisi=New FileInfo(YuklemeDizini & DosyaAdi) satırında dosya adı ile dizin adını birleştirerek dosyaya ait bilgiyi oluşturduk.
If DosyaBilgisi.Exists=False Then satırında dosyanın zaten mevcut olup olmadığını kontrol ediyoruz. Dosya mevcut değilse "false", mevcutsa "true" döner.
GelenDosya.SaveAs(YuklemeDizini & DosyaAdi) satırı ile gelen dosyayı dizin içine kaydettik ve yükleme başarıldığı için tarayıcıyı geri döndürdük.
Eğer dosya zaten mevcut olduğundan yüklenemiyor ise kullanıcıya bir uyarı gösterip, bir lik koyarak geri dönebilmesini sağladık.

Yukarıda kodlarını verdiğim dosyalar.aspx ve yukle.aspx dosyalarını oluşturun ve sunucunuzda bir dizine koyarak dosyalar.aspx´i çalıştırın.

Bu yazı kaynak göstermek kaydıyla kısmen, tamamen veya değiştirilerek yayınlanabilir.
En yeni makaleler FındıkKurdu'nda yayınlanır. http://www.findikkurdu.com

Kolay gelsin.

ufukyayla 28.07.2005 22:18:02 Yorumlar [0]



Sayfalar : [1] 2 3

 # Blog - ASP.NET!VB
  Karalama Defteri
 Giriş
 Bölümler
 Son Yorumlar
 
  Bölümler
 Deli Gömleği
 Eşeryakoli
 Makaleler
 Projeler
 UfukSZP Dağıtımı
 ASP.NET Maceraları
 
  Son Karalamalar
 Foruma üye girince oluşan ...
 Taşındık
 SoulTips Gibi Birşey
 Ya Nasip
 Ulan Ubuntu
 El Yapımı Projeksiyon
 Ne İstiyor Bu Üyeler
 Sınıflarda Kalıtım (Inheri...
 Sadeleştirme Şart
 South Park
 
  Son Yorumlananlar
 Ya Nasip
 Ben Ziraat Mühendisiyim
 UfukSZP Dağıtımını Kullananl...
 Grup Hepsi
 Ne İstiyor Bu Üyeler
 Ziyaretçi Defteri
 Powered By Access
 Ulan Ubuntu
 Network A.K.T. (Arada Kafamı...
 Sınıf, Nesne, Nesneye Yöneli...
 
  Güzel İnsanlar
 Fındık Kabuğu
 Evren AYAN
 Halil TUNÇ
 Can HANHAN
 Mehmet TURAC
 Bloglar Alemi
 
  Şu Anda Bağlılar
 Misafir, Misafir, Misafir 
 
  Ordan Burdan
  
 
 
 
 
 
 
 
 
 

Bu sayfa 0,031 saniyede derlendi.





Bu sitede çalışan bütün ASP.net ve JavaScript kodları orjinaldir ve sıfırdan yazılmıştır.
Site yaygın bütün tarayıcılarla (IE, Firefox vs.) uyumludur.
Bu sitede kullanılan SZP.net 4.1 Beta altyapısı MS Access, MySQL Server ve MS-SQL Server ile çalışabilmektedir.

Tasarım & Kodlama
Ufuk YAYLA