CSharp çalışıyorum. Get Set metodlarını anladım ama aklıma çılgın bir soru geldi. Bir daire (Circle) clasımız var. Alan (area), çevre (circumference) ve yarıçap (radius) propertilerimiz var. Bunlardan birini set ettiğimizde diğerlerini otomatik hesaplasın istiyorum ve bunu sadece get set metodlarıyla yapmak istiyorum. Doğrudan yapmaya çalıştığımda StackOverflow hatası veriyor. Sebebi sürekli birbirlerini çağırıyorlar. Biryerde kesilmesi gerekiyor ama bu kesme algoritmasını yapamadım bir türlü. Hiçbir fonksiyon kullanmak istemiyorum. İstesem kullanırım ama sadece get set ve lazım olursa private bir değişken ile halletmek istiyorum. Bu bir beyin jimnastiği oldu benim için :) 1 saattir kafa patlatıyorum ama beceremedim. Bu ödev filan değil sadece kendi başıma merak ettiğim bir soru. Cevaplarınız için teşekkürler. Benim yazdığım kod şu şekilde:

namespace StudentAutomation.Model { 
    public class Circle {
        private char starter = 'x';

        public Double circumference {
            get {
                return circumference;
            }
            set {
                if (starter == 'x')
                    starter = 'c';

                circumference = value;

                if (starter != 'r')
                    radius = circumference / (2 * Math.PI);
                if (starter != 'a')
                    area = Math.PI * radius * radius;

                if (starter == 'c')
                    starter = 'x';
            }
        }

        public Double radius {
            get {
                return radius;
            }
            set {
                if (starter == 'x')
                    starter = 'r';

                radius = value;

                if (starter != 'c')
                    circumference = 2 * Math.PI * radius;
                if (starter != 'a')
                    area = Math.PI * radius * radius;

                if (starter == 'r')
                    starter = 'x';
            }
        }

        public Double area {
            get {
                return area;
            }
            set {
                if (starter == 'x')
                    starter = 'a';

                area = value;

                if (starter != 'r')
                    radius = Math.Sqrt(area / Math.PI);
                if (starter != 'c')
                    circumference = 2 * Math.PI * radius;

                if (starter == 'a')
                    starter = 'x';
            }
        }

    }
}

soruldu: 09 Oca, 06:25

kodmanyagha's gravatar image

kodmanyagha
3.1k132852
cevap kabul oranı: 15%

2

Bu arada, property isimleri icin .Net dunyasinda Pascal Casing kullaniliyor, Camel Casing degil. (circumference => Circumference )

(09 Oca, 18:26) eser eser's gravatar image

Alışkanlıklar kolay bırakılmıyor :) Yıllarca camel casing kullandım.

(12 Oca, 03:37) kodmanyagha kodmanyagha's gravatar image

Get/Set genelde encapsulation için kullanılıyor. Genel yazımı da aşağıdaki biçimde.

private int _variable;

public int Variable{
    get{
        return _variable;
    }
    set{
        _variable = value;
    }
}

Sizin yaptığınız hata getterın tekrardan kendini çağırması, yani şöyle

public int Variable{
    get{
        return Variable;
    }
    set{
        Variable = value;
    }
}

Eğerki her bir property için private veya protected değişken tanımlayıp onlar üzerinden hesaplamaları yaptırırsanız problem çözülücektir.

permanent link

cevaplandı: 09 Oca, 06:43

ArnesTwin's gravatar image

ArnesTwin
1.1k1511
cevap kabul oranı: 14%

değiştirildi: 09 Oca, 06:43

Bu bilgi için teşekkür edeirm. Hemen deniyorum.

(09 Oca, 06:48) kodmanyagha kodmanyagha's gravatar image

Tamam oldu. Bilgi için teşekkür ederim ArnesTwin :)

public class Circle {
    private double circumference;
    private double radius;
    private double area;

    public Double Circumference {
        get {
            return circumference;
        }
        set {

            circumference = value;
            radius = circumference / (2 * Math.PI);
            area = Math.PI * radius * radius;
        }
    }

    public Double Radius {
        get {
            return radius;
        }
        set {
            radius = value;
            circumference = 2 * Math.PI * radius;
            area = Math.PI * radius * radius;
        }
    }

    public Double Area {
        get {
            return area;
        }
        set {
            area = value;
            radius = Math.Sqrt(area / Math.PI);
            circumference = 2 * Math.PI * radius;
        }
    }
}
permanent link

cevaplandı: 09 Oca, 06:51

kodmanyagha's gravatar image

kodmanyagha
3.1k132852
cevap kabul oranı: 15%

Rica ederim :)

(09 Oca, 12:51) ArnesTwin ArnesTwin's gravatar image

Bu arada iki defa setter iç içe çağırılamıyor. Örneğin:

    public int setme {
        get { return setme;  }
        set {
            setme = value;
            setme2 = value;
        }
    }

    public int setme2 {
        get { return setme2; }
        set {
            setme2 = value;
        }
    }

setme = 10; dediğiniz zaman hata veriyor. Halbuki bunlar birbirlerini sürekli çağıran şeyler değil. en son setme2'yi set ediyor ve orda kesiyor. Demekki Csharpta set için ayrılan stack 1 eleman uzunluğunda. Bu mantıksız. Eğer stack kullanıyorsan bunun daha geniş bir sınırı olması gerekiyor. Eğer stack kullanmıyorlarsa o zaman neden StackOverflowException fırlatılıyor? Onun yerine mesela NotAcceptableRecursiveException falan kullan yani. Milleti yanlış yönlendirmeyin karşim. Csharpı yazan adamlar bunu bilerek mi yaptı yoksa gözlerinden mi kaçtı bilmiyorum ama bu bence csharpın bir eksiği. Koskoca microsoft mühendislerine laf söylemiş gibi oluyorum ama ben olsaydım iç içe set çağırabilme olayını koyardım dile. Gözünü yediğimin Java'sı. Böyle gereksiz şeylerle uğraştırmıyor adamı. Property başka metod başka. Herşeyin çalışması belli mantığı belli :S

permanent link

cevaplandı: 09 Oca, 06:55

kodmanyagha's gravatar image

kodmanyagha
3.1k132852
cevap kabul oranı: 15%

değiştirildi: 09 Oca, 07:07

Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×238
×1
×1

Soruldu: 09 Oca, 06:25

Görüntüleme: 362 kez

Son güncelleme: 12 Oca, 03:37

powered by BitNami OSQA