İçeriğin rss beslemesi kullanımda değil Soru - Cevap Bölümü / Kategori: Programlama

17/12/2004 - 08:12:43 cevap (7) Okunma : 9322 Bu yazıyı 1 kişi tuttu.

prototype class

Selamlar

Öncelikle forumun tüm Flash alemine hayırlı olmasını dileyeyim ve bir soruyla bu kategorideki açılışı yapayım.

Bu aralar Çizim API leri ile fazlasıyla ilgileniyorum ve her çizim şekli için prototipler tanımlıyorum. Bildiğim kasarıyla .prototype olayı Flash 5 stili.

Gerçi benim için yazımı çok kolay oluyor ama bu prototipleri ileriye dönük uyumluluk açısından class dosyaları haline getirmek istiyorum. işte bu noktada çok takıldım ve bir türlü başarılı olamadım.

Aşağıda örnek olarak vereceğim prototipin class biçimini benim için tanımlarsanız fazlasıyla memnun olurum :D

MovieClip.prototype.kareCiz = function(x,y,w,h){
      //parametreler string geliyor
      //number a çevriliyor
      var x = parseFloat(x); //x eksendeki nokta
      var y = parseFloat(y); //y eksendeki nokta 
      var w = parseFloat(w); //genişlik 
      var h = parseFloat(h); //yükseklik
      this.moveTo(x,y);
      this.lineStyle(1, 0x000000, 100);
      this.lineTo(w,y);
      this.lineTo(w,h);
      this.lineTo(x,h);
      this.lineTo(x,y);
}

.

adres Ufuk G profilini göster
Ufuk Gün 17.12.2004 23:10:55
En iyi cevap mı ?
class kareciz {
  // Değişkenleri ve tipleri tanımlayalım
 var x = parseFloat(x); //x eksendeki nokta 
 var y = parseFloat(y); //y eksendeki nokta 
 var w = parseFloat(w); //genişlik 
 var h = parseFloat(h); //yükseklik
  // Aşağıdaki fonksiyon ise bir  'constructor'
  // çünkü class ile aynı isime sahip.
  // constructorlar ne yapar? değişkenleri ve tipleri yaratırlar
  // fonksiyon olarak tanımlandıkları halde geri döndürme işlemi yapmazlar.
  function kareciz(param_x:parseFloat(x), param_y:parseFloat(y),param_w:parseFloat(w),parse_h = parseFloat(h)) 
    {
    // Yeni bir kare çizdir nesnesi yaratıldığında tipler ve değişkenler yaratılacak
    this.x = param_x;
    this.y = param_y;
    this.w = param_w;
    this.h = param_h;
     }
   // Karemizide çizdirelim.
  function karecizikdir():Void 
    {
    this.moveTo(x,y); 
    this.lineStyle(1, 0x000000, 100); 
    this.lineTo(w,y); 
    this.lineTo(w,h); 
    this.lineTo(x,h);  
    this.lineTo(x,y);
    }
}

Evet bu yarattığımız class ımız. Peki olayı kullanmak istersek ne yapıcaz..

var cizdirgitsin:kareciz = new kareciz('degisken1', 'degisken2','degisken3','degisken4');

Bu arada constructor hakkında kısa bir bilgi vermek istiyorum. Bazen yeni başlayan arkadaşların kafası karışıyor. Bir function yaratılıyor ama geri döndürme tipi yok yada "return" komutu yok.

Constructorlar sadece komutlar işleme konduğunda istenilen tipleri ve değişkenleri oluşturur başka bir kullanım amaçları yoktur.

Güzel günnerde kullanmanız dileğiyle…

adres Math.PI profilini göster
Harun O 18.12.2004 07:18:04
En iyi cevap mı ?

Çok çok teşekkürler flame.

Elimde bir AS 2.0 kitabı var ve class konusunu o kadar dikkatli okumama rağmen constructor function ın bir değer döndürmediğini ilk defa senin mesajında farkına vardım.

Bu benim için önemli, çünkü değer döndürmesini istediğim satırları hep constructor kısmına yazıyordum ve sonrasında nerde yanlış yaptım diye dövünüp duruyordum.

Tekrar teşekkürler.

adres lostchild profilini göster
lostchild 20.12.2004 02:50:16
En iyi cevap mı ?

AS1’ de yazılan prototype lar AS2 de kullanılabilir. Bu yüzden MovieClip için ayrıca class yaratmanıza gerek yok. Çünkü aslında,internal olarak hala AS1 e çevriliyor AS2 :


/*
 AS1+AS2
*/
// ->prototype üzerinde
MovieClip.prototype.rotate = function(){
    this.onEnterFrame = function(){
        this._rotation--
    }
}
polygon_mc.rotate()
// direkt sınıf üzerinde
MovieClip.testClip = 'test...'
trace(MovieClip.testClip)

Söylediklerimizin işlemeyeceği durumlar var. Şöyle ki : AS2 deki sınıfları buradaki sorun açısından iki gruba ayırabiliriz :

* ( dinamik olmayan ) sınıflar


class Gazete {
    // yapılacaklar ...
}

Bu sınıfın kendisine ( prototype ına değil) ve bu sınıfın örneği( instance ı) olan nesnelere yeni bir metod veya özellik ekleyemeyiz. output ta derleyici hatası verecektir (compile error)

* dinamik sınıflar

dynamic class OnlineGazete {
    // yapılacaklar
}

Bu sınıfın kendisine ve bu sınıfın örneği( instance ı) olan nesnelere yeni bir metod veya özellik ekleyebiliriz.

Tüm AS2 sınıflarının prototype larını kullanabilirsin. Kullanamayacağın durumlar :

Mesela AS2’ de Stage ve Math nesnelerine yeni metodları AS1 stilinde ekleyemezsin. Aslında öncelikle, bu iki sınıfa zaten prototype yazılmaz ( öyle denir ama…). Çünkü bunlar statik sınıftır, daha açık olarak söylenirse, bunları kullanmak için bunların instance larını oluşturmaz, direkt kullanırız. örnek olarak :

// AS1 ->yanlış
Math.prototype.isNatural = function(number)
    var isPositive = ( number>=0)
    var isInteger = (number%1 == 0) 
    return isPositive && isInteger
}
// AS1 ->doğru
Math.isNatural = function(number)
    var isPositive = ( number>=0)
    var isInteger = (number%1 == 0) 
    return isPositive && isInteger
}
var x = Math.isNatural(4)
trace(x)

zaten basit çerçevede, mantık olarak ne Math ın ne de Stage in örneğini oluşturmanın bir anlamı yoktur. Misal olarak Stage bir tanedir o esnada ( o swf için ). Haliyle onun instance ını oluşturabiliyor olmak da manasız olurdu. Uzatmadan sadede gelirsek, AS2 deki internal sınıfların,("built-in" olarak tabir edilenler)bazıları dinamiktir, bazıları da dinamik değildir.işte Math ve Stage dinamik olmayan ve instance ları oluşturulmaayan sınıflardan, haliyle arıza çıkartıyorlar. Ama verdiğim örnekte de olduğu gibi MovieClip ve diğer sınıflar için prototype yazabilir ve AS2 de kullanabilirsin.Yani prototype a yeni metod ve özellikler ya da eventhandler lar eklemede sınıfın dinamik veya dinamik olmayışının bir önemi yok.

Hoşuma giden bir konu olduğu için uzattım sanırım. Eğer Math veya Stage gibi dinamik olmayan instance ı oluşturulmadan kullanılan sınıflara ( nesnelere) metod veya özellikleri nasıl ekleyebileceğini merak ediyorsan bunu da yazmaya çalışırım, çünkü bir kaç yolu var (biraz detaylı…)

iyi çalışmalar…

adres Math.PI profilini göster
Harun O 21.12.2004 07:32:15
En iyi cevap mı ?

lostchild ilgin için teşekkürler.

Öncelikle dinamik/dinamik olmayan sınıflar hakkında yazdıkların bilgim dahilindeydi. Fakat dinamik olmayan sınıflara metod ve özellik eklenebileceğini bilmiyordum. istersen anlatabilirim demişsin, neden olmasın! Seve seve okurum.

Elimde Savaş Tekin in kitabı var ve orada prototype ların ileride desteklenmeyeceği yazıyor. Macromedia nın ileriye dönük politikalarında gerçekten böyle bir şey var mı?

Saygılarımla…

adres lostchild profilini göster
lostchild 24.12.2004 03:35:54
En iyi cevap mı ?
Faydalı cevap

Ne yazık ki sadece AS2’ ye yönelik olan çözüm hiç de yaratıcı değil.Ayrı bir sınıf yaratıp içine yazmak :))

class newMath
{
    function isNatural(num:Number):Boolean
     {
    var isNotNegative:Boolean = ( number>=0)
    var isInteger:Boolean = (number%1 == 0) 
    return isNotNegative && isInteger
     }
}

aklımıza muhtemel olaarak gelecek olan diğer çözüm şu olabilirdi : yeni yarattığımız newMath adlı sınıfın, Math sınıfının metodlarını kullanabilmesi, yani şöyle :


class Math2 extends Math
{
    // kod...
}

Fakat bu da ne yazık ki işe yaramamakta.diğer iki çözüm AS1 ile ilgili. ilki, "intrinsic" anahtar kelimesi sayesinde gerçekleşmekte. Elimizde bir AS1 sınıfı varsa ve onu AS2 sınıfı gibi kullanmak istiyorsak, ( aslında sınıf değil datatype tanımı olan ) bir sınıf yaratıp onun içine sadece data type ları yazıyoruz.

Flash zaten internal olarak halen AS1 sınıflarını kullanıyor ( ve bunu yapıyor ) Flash mx2004 ün kurulu olduğu klasör altında "Flash MX 2004\EN\First Run\Classes"klasörünü açıp Math.as dosyasına bakarsak şunu görürüz :

( Aslında core class ların hepsinde görüyoruz )

intrinsic class Math
{
    static var E:Number;
    static var LN10:Number;
    static var LN2:Number;
    static var LOG10E:Number;
    static var LOG2E:Number;
    static var PI:Number;
    static var SQRT1_2:Number;
    static var SQRT2:Number;

    static function abs(value:Number):Number;
    static function acos(value:Number):Number;
    static function asin(value:Number):Number;
    static function atan(value:Number):Number;
    static function atan2(value1:Number,value2:Number):Number;
    static function ceil(value:Number):Number;
    static function cos(value:Number):Number;
    static function exp(value:Number):Number;
    static function floor(value:Number):Number;
    static function log(value:Number):Number;
    static function max(value1:Number,value2:Number):Number;
    static function min(value1:Number,value2:Number):Number;
    static function pow(value1:Number,value2:Number):Number;
    static function random():Number;
    static function round(value:Number):Number;
    static function sin(value:Number):Number;
    static function sqrt(value:Number):Number;
    static function tan(value:Number):Number;
}

Burada yapılanı, "intrinsic" kullanarak biz de yapabiliriz.

/*
    AS1 static method
    Math nesnesi zaten var Flash da
    flash dosyasında alttaki kod :
*/
Math.isNatural = function(num)
    var isNotNegative = ( num >=0)
    var isInteger = (num %1 == 0) 
    return isNotNegative && isInteger
}

// Math.as -> varolan AS2 sınıf dosyası 
intrinsic class Math
{
    /*
     Diğer satırların altına
     ... aşağıdaki satır eklencek ...
    */
    static function isNatural(num:Number):Boolean
}

Sonuncusu da benim böyle bir yol ararken bulduğum bir yöntem,ama normalde işlememesi gerekiyor, ama yine de işliyor (-: Niye işlediğini ben de merak ediyorum … !!


// AS1+AS2
var newMath = Math
// --->
newMath.isNatural = function(num)
    var isNotNegative = ( num >=0)
    var isInteger = (num %1 == 0) 
    return isNotNegative && isInteger
} 
// test
trace (newMath.isNatural(7))

Tek tek denemeye vaktim olmadı. ( sanmıyorum ama .. )umarım çalışmayan bir şey olmaz…

"prototype" mevzusu ise şöyle sanırım : Macromedia nın yeni sürümlerini artık tümüyle yeni kod mimarisine göre yapılandırmak isteyeceği doğru olsa gerek ve normal bir yaklaşım ama AS’de de, JS gibi ECMA model alınıyor.

http://www.mozilla.org/js/language/es4

ECMA da halen "prototype" var. Bilgi için : http://www.mozilla.org/js/language/es4/core/definitions.html#prototype

Bir de şunu eklemek gerek AS2 sınıflarında halen prototype var, hatta ECMA da olmayan proto var. hatta constructor , constructor var ( son iki özelliği sınıf dosyalarında göremezsin ama internal olarak kullanılıyor ).

Bu koşullarda, yakın bir gelecekte ( bir sürüm sonra örneğin ) prototype ın çıkarılması bana çok da mümkün görünmüyor.Öncelikle macromedia için bu bir risk ( geriye yönelik uyumsuzluk ) Çünkü pozisyonları aynı olmasa da, halen Flash 3/4/5 ten kalma AS elemanları desteklenmekte.

Kaldı ki halen AS1 ile iş yapan bir çok kişi var. Baktığımızda AS1 halen çok daha esnek bir yapıda bu tür metodları özellikleri eklemek açısından. ( Bunun örneklerini yukarıda yapmaya çalıştığımız şeyden görebiliriz )

iyi çalışmalar …

adres Math.PI profilini göster
Harun O 25.12.2004 06:57:21
En iyi cevap mı ?

Çok teşekkürler.

Fazlasıyla yardımcı oldun.

Saygılar…

adres imaginer profilini göster
imaginer 02.03.2005 01:08:21
En iyi cevap mı ?

merhaba, öncelikle bu konu ile ilgili bir şey eklemeyeceğimi belirtmek isterim. Sonra da bu forumda elektrik ya da elektronikle uğraşan arkadaşlardan yardım talep ediyorum.

bir sorum var ve bu başlık altında sormayı uygun gördüm.

bir anahtar, sigorta, direnç, ampermetre, voltmetre, almaç ve bir kaynaktan oluşan bir devre düşünün. Toplamda 14 adet bağlantı noktası mevcut. Belki elektronik tasarım programlarından görmüşsünüzdür, bir noktanın üzerine gelince imleç değişmekte ve fare tıklanıp başka bir noktanın üzerinde bırakılınca iki nokta arasına bir çizgi (kablo) çizmekte. Aslında buraya kadar bilindik konular. Problem bundan sonra.

Şöyle ki: Örneğin kullanıcı sadece kaynak, anahtar ve alıcı arasında doğru bağlantıyı gerçekleştirince ve anahtarı kapattığında (örneğin lamba ışık verecek) alıcı çalışacak. Bağlantı yanlış olduğunda alıcı çalışmayacak. Ampermetreyi devreye doğru bağladığında ampermetre devrenin akımını gösterecek. Voltmetreyi devreye seri bağladığında devrenin çalışması durdurulup voltmetrenin seri bağlanamayacağı konusunda kullanıcı uyarılacak. Buna benzer daha bir sürü kombinasyon mevcut bu basit devre için. Elbette uzun satırlar halinde koşul ve döngü kontrolü ile bunu yapmak mümkün. Ancak bunun daha kısa ve işlevsel bir yolunu bulabilirmiyiz?

Mesleyi tam olarak izah edemedimse ilgilenen arkadaşlara yapmak istediğim şeyin bir örneğini gönderebilirim. sanırım o zaman daha iyi anlaşırız.

herkese iyi çalışmalar.

aç-kapa Bu Yazıyı Tutanlar

MMIstanbul Adobe UG MMIstanbul Adobe UG

adobe user group

ColdFusion, Flex, AIR, Flash, PDF, Dreamweaver, Fireworks, Photoshop, Illustrator, INdesign, Premiere, Soundbooth, Lightroom, InCopy, JRun, LiveCycle, Acrobat, AfteEffects, Resmi Adobe Kullanıcı Grubu.

yeni üyelik | şifremi unuttum

aç-kapa Konferans 2. Ulusal Yazılım Mimarisi Konferansı - UYMK'08

2. Ulusal Yazılım Mimarisi Konferansı - UYMK'08

2.Ulusal Yazılım Mimarisi Konferansı (UYMK’08), 11 – 12 Eylül 2008 tarihlerinde Ege Üniversitesi Bilgisayar Mühendisliği Bölümü ev sah...
Kategori: Konferans

aç-kapa Sergi İstanbul'da Bir Sürrealist: Salvador Dali

İstanbul'da Bir Sürrealist: Salvador Dali

Picasso ve Rodin’den sonra kimi görmek istersiniz deseler; Salvador Dali listenin ilk başlarında yer almaz mı? Ressam, yazar, bilim adamı, tasar...
Kategori: Sergi

aç-kapa Eğitim PAZARLAMA EĞİTİMLERİ

PAZARLAMA EĞİTİMLERİ

1-0 Eğitim Ajansı, eğitim programları Yer : Bir Sıfır Eğitim Danışmanlık Zaman Aralığı : Eylül – Ekim 2008 Adres : Çırağan Cad. Şahnisin Sok. No...
Kategori: Eğitim

aç-kapa Eğitim İLETİŞİM EĞİTİMLERİ

İLETİŞİM EĞİTİMLERİ

Kısa zamanda sektöre hızlı bir giriş yapan 1-0 Eğitim Ajansı iş hayatında kariyer yapmak isteyen katılımcılarını 1-0 öne geçirmeye devam ediyor. 1-0 ...
Kategori: Eğitim

aç-kapa Yarışma İnteraktif Pazarlama Zirvesi ve Grand Interactive Awards

İnteraktif Pazarlama Zirvesi ve Grand Interactive Awards

Türkiye’nin interaktif pazarlama projelerini değerlendiren ilk ve tek yarışması Grand Interactive Awards (GIA) için başvurular 15 Ağustos tarihi...
Kategori: Yarışma

üyeler Üyelerimizden...

stats Kimler Burada? web stats

Son 1 dakika içinde MMIstanbul' da 205 (2 kayıtlı, 203 ziyaretçi) kullanıcı varmış. Login durumda olanlar aşağıda:

coldfusion mysql ubuntu
 
sponsor adobe istanbul