| 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"> </div><br/> <div id="kutu2" name="kutu2" style="width:100%;height:100px;background:ff00ff"> </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,"&","&") ysMetin=Replace(ysMetin,">",">") ysMetin=Replace(ysMetin,"<","<") ysMetin=Replace(ysMetin,"'","'") ysMetin=Replace(ysMetin,"""",""") 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 | |  |
|