Şimdi Ara

c# isim saklama(name hiding) sorusu

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
15
Cevap
0
Favori
736
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • kitapta aşağıdaki kodda Y.A elemanın X.A elemanını gizlediğini dair uyarı vermesi gerektiği yazıyor ama ben aynı kodu yazmama rağmen bir hata almıyorum, yardım lütfen.
    using System;

    class X
    {
    protected int a;
    public X(int a)
    {
    this.a = a;
    }
    public X()
    {
    }
    public int A
    {
    get
    {

    Console.WriteLine("X sınıfı");
    return a;
    }
    }
    }
    class Y : X
    {
    protected int b;

    public Y(int a)
    {
    this.b = a;
    }
    public Y()
    {

    }
    public int A
    {
    get
    {
    Console.WriteLine("Y sınıfı");
    return b;

    }
    }
    }
    class Mainetot
    {
    static void Main(string[] args)
    {
    Y y = new Y(5);
    int deneme = y.A;

    }
    }



    < Bu mesaj bu kişi tarafından değiştirildi deniz caliskan -- 4 Temmuz 2017; 17:6:3 >



  • A bir metot sanırım. Dolayısıyla tanımlarken ve kullanırken parametre parantezlerinin olması lazım. Parametresi olmadığı için parantezlerin içi boş olur.



    İkiyerde tanım bir yerde kullanım var.

    public int A()

    {

    }



    int deneme = y.A();

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • hyrgul H kullanıcısına yanıt
    onlar bir property metot ve ya fonksiyon değil üstat, c#' a ait güzel bir özellik bu :)
  • Güzel özellikmiş. Öğrenmiş olduk.

    Belki get içine sadece return yazılabiliyordur. Oradaki Console.WriteLine komutlarını silip deneyebilirsiniz.

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • hyrgul H kullanıcısına yanıt
    dediğinide denedim hala uyarı vermiyor sıkıntı şu: kodun çalışması, kitapta ise bu kod için uyarı verir demesi, acaba ben visual studionun 2017'sini kullandığım için mi öyle oluyor (yeni bir özellik gelmiş olabilir) ? çünkü kitap bir eski versiyonundan anlatıyor yani c#6.0 ile anlatıyor ondan mı acaba diye düşünüyorum.
  • Uyarı ya da hata mesajını yazar mısınız?

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • hyrgul H kullanıcısına yanıt
    warning CS0108 : The keyword new is required on 'Y.A' because it hides inherited member 'X.A'
  • e veriyor ya uyarıyı yukarıda uyarının ingilizcesini yazmışsınız onun türkçesi bahsettiğiniz uyarıdır
    ortada bir sorun yok ki
    c# isim saklama(name hiding) sorusu
  • Türetilen Y sınıfındaki aynı A ismindeki özelliğin önüne new ifadesi yazarak dener misiniz?



    new public int A

    {



    }



    Kaynak:

    https://stackoverflow.com/questions/5933045/what-if-i-dont-heed-the-warning-hides-inherited-member-to-make-the-current-me

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • Gökşen PASLI G kullanıcısına yanıt
    bende uyarı vermiyor :( direk çıktı olarak:

    Y sınıfı
    press any key...

    çıktısını veriyor.
  • hyrgul H kullanıcısına yanıt
    new koyunca bir şey değişmedi hala aynı çıktıyı alıyorum, zaten kitapta new koyulmmaış halini veriyor ve bunda uyarı alırsın diyor ama daha sonra önüne new koyarsan hata almassın diyor, ama bende new koyuncada koymayınca da uyarı falan vermeden direk çıktı gösteriyor
    çıktı şu :

    Y sınıfı
    Press any ...
  • deniz caliskan kullanıcısına yanıt
    tamam zaten öyle olacak sen herhalde console da o uyarı çıkacak sanıyorsun öyle birşey yok o gösterdiğim ekranda çıkacak bilgi amaçlı uyarı o zaten
  • Gökşen PASLI G kullanıcısına yanıt
    eyw
  • hocam property'ler temelde fonksiyondur.

    public int BirSayi { get; set; }
    seklinde olanlara "auto-property" denir ozel adi yani. bu aslinda tamamen suna esittir:

    private int birSayi; 
    public int BirSayi
    {
    get { return birSayi; }
    set { birSayi = value; }
    }


    (bu sekilde cok kullanildigi icin ustteki hali var. adindan anlasiliyor zaten "auto")
    ki bu normal bir "property"dir ve get set ici istedigin gibi degistirilebilir.

    ve bu propertyler de yine kisa yazilistir. karsiligi 2 metoddur ve bunlar arka planda su koda cevrilir:

    private int birSayi; // bu normal bir field ozel bir yani yok. property ile birlikte kullanimda "backing field" olarak gecer bunlar. yani destekci alan. 

    public int get_BirSayi()
    {
    return birSayi;
    }

    public void set_BirSayi(int value)
    {
    birSayi = value; // property'lerde "value" kelimesinin ozel olma nedeni bu metodda parametre olmasi.
    }


    bu kod otomatik olarak uretilir dedigim gibi. auto-property'ler icin ise backing field da otomatik uretilir. ve isimler tam olarak boyle degil, C# icinde illegal isim kullaniliyor IL (intermediate language. biraz ileri seviye bir konu arastirabilirsin) tarafindan.




  • Çok teşekkür ederim.

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.