Özel alanlar neden örneğe özel değil, türe özeldir?


153

C # 'da (ve diğer birçok dilde) aynı türdeki diğer örneklerin özel alanlarına erişmek son derece meşrudur. Örneğin:

public class Foo
{
    private bool aBool;

    public void DoBar(Foo anotherFoo)
    {
        if (anotherFoo.aBool) ...
    }
}

Gibi C # şartname (bölümler 3.5.1, 3.5.2) özel alanlara erişim bir tür değil, bir örneği olduğunu belirtmektedir. Bunu bir meslektaşımla tartışıyorum ve bunun böyle çalışmasının bir nedenini bulmaya çalışıyoruz (aynı örneğe erişimi kısıtlamak yerine).

Gelebileceğimiz en iyi argüman, sınıfın başka bir örnekle eşitliği belirlemek için özel alanlara erişmek isteyebileceği eşitlik kontrolleri içindir. Başka nedenleri var mı? Yoksa bunun böyle çalışması gerektiği anlamına gelen altın bir sebep mi yoksa tamamen imkansız mı?


18
Alternatifin faydaları nelerdir?
Jon Skeet

19
Gerçek dünyayı çok iyi modellemediği doğrudur. Sonuçta, arabamın ne kadar gaz kaldığını bildirebilmesi, arabamın HER otomobilin ne kadar gaz bıraktığını söyleyebileceği anlamına gelmez. Yani, evet, teorik olarak "özel durum" erişimine sahip olduğunu görebiliyorum. Yine de asla kullanmam gibi hissediyorum, çünkü vakaların% 99'unda bu değişkene başka bir örneğin erişmesini gerçekten istiyorum.
aquinas

2
@Jon Sözde 'faydalar' için alınan konum, sınıfların aynı türden bağımsız olarak başka bir örneğin iç durumunu bilmemesidir. Her söze göre bir fayda değil, ama muhtemelen diğerini seçmek için oldukça iyi bir neden var ve anlamaya çalıştığımız şey bu
RichK

4
Her zaman eğer başarısız olur ki, yapıcı başlatıldı alıcı / ayarlayıcı kapanışları bir çift, içine değişkeni yapabilir bu da ... başlatılması sırasında olduğu gibi aynı değildir
Martin Sojka

8
Scala, örnek özel üyeler sağlar - Java, C # ve diğer birçok dilde bulunmayan diğer birçok erişim düzeyi ile birlikte. Bu oldukça yasal bir soru.
Bruno Reis

Yanıtlar:


73

Bu şekilde çalışmasının bir nedeni, erişim değiştiricilerinin derleme zamanında çalışmasıdır . Bu nedenle, belirli bir nesnenin aynı zamanda geçerli nesne olup olmadığını belirlemek kolay değildir. Örneğin, şu kodu göz önünde bulundurun:

public class Foo
{
    private int bar;

    public void Baz(Foo other)
    {
        other.bar = 2;
    }

    public void Boo()
    {
        Baz(this);
    }
}

Derleyici otherbunun gerçekten olduğunu anlayabilir thismi? Her durumda değil. Biri, bu sadece derlemek gerektiğini iddia edebilir, ancak bu , doğru örneğin özel bir örnek üyesinin erişilebilir olmadığı bir kod yoluna sahip olduğumuz anlamına gelir , ki bu daha da kötü.

Sadece tip seviyesini ziyade sorun uysal olduğunu nesne düzeyinde görünürlük sağlar gerektiren yanı sıra bu gibi görünen bir durum yapma gerektiğini çalışmak aslında işi.

DÜZENLE : Danilel Hilgarth'ın bu akıl yürütmenin geriye dönük olduğu görüşü hak ediyor. Dil tasarımcıları istedikleri dili oluşturabilirler ve derleyici yazarları buna uymak zorundadır. Bununla birlikte, dil tasarımcılarının derleyici yazarlarının işlerini yapmalarını kolaylaştırmak için bazı teşvikleri var. (Bu durumda, özel üyelerin yalnızcathis (dolaylı veya açık olarak) üzerinden erişilebileceğini iddia etmek yeterince kolaydır ).

Ancak, konunun olması gerekenden daha kafa karıştırıcı olduğuna inanıyorum. Çoğu kullanıcı (kendim dahil) yukarıdaki kod işe yaramazsa gereksiz yere sınırlayıcı bulacaktır: sonuçta, bu benim veri erişmeye çalışıyorum! Neden geçmek zorundayım this?

Kısacası, derleyici için "zor" olduğu için durumu abartmış olabileceğimi düşünüyorum. Gerçekte karşılaşmak istediğim şey, yukarıdaki durumun tasarımcıların çalışmak istediği bir durum gibi görünmesidir.


33
IMHO, bu akıl yürütme yanlış bir yol. Derleyici dilin kurallarını uygular. Onları YAPAMAZ. Başka bir deyişle, özel üyeler "özel tür" "ve" özel tür "değilse, derleyici başka şekillerde de uygulanırdı, örneğin yalnızca izin vermekle this.bar = 2birlikte değil other.bar = 2, otherfarklı bir örnek olabilirdi.
Daniel Hilgarth

@Daniel Bu iyi bir nokta, ama belirttiğim gibi, bu kısıtlamaya sahip olmanın sınıf düzeyinde görünürlükten daha kötü olacağını düşünüyorum.
dlev

3
@dlev: "Özel örnek" in iyi bir şey olduğunu düşünüp düşünmediğim hakkında hiçbir şey söylemedim. :-) Sadece belirtmek istedim, teknik bir uygulamanın dilin kurallarını belirlediğini ve bence bu argümanın doğru olmadığını savunuyorsunuz.
Daniel Hilgarth

2
@Daniel Noktası alındı. Tabii ki bunun geçerli bir değerlendirme olduğunu düşünüyorum, ancak elbette dil tasarımcılarının ne istediklerini anladıkları ve derleyici yazarlarının buna uyduğu konusunda haklısınız.
dlev

2
Derleyici argümanının geçerli olduğunu düşünmüyorum. Etrafında yalnızca örneğe özel (Ruby gibi) izin veren ve örneğe göre özel ve sınıf-özel seçeneğine (Eiffel gibi) izin veren diller vardır. Derleyici oluşturma, bu diller için daha zor veya kolay olmadı. Daha fazla bilgi için, aynı zamanda ileti dizisindeki cevabım bölümüne de bakın.
Abel

61

Çünkü C # ve benzeri dillerde kullanılan kapsülleme türünün amacı * bellekteki farklı nesneler değil, farklı kod parçalarının (C # ve Java sınıfları) karşılıklı bağımlılığını azaltmaktır.

Örneğin, başka bir sınıftaki bazı alanları kullanan bir sınıfta kod yazarsanız, bu sınıflar çok sıkı bir şekilde birleştirilir. Ancak, aynı sınıftan iki nesneye sahip olduğunuz kodla uğraşıyorsanız, ekstra bir bağımlılık yoktur. Bir sınıf her zaman kendisine bağlıdır.

Bununla birlikte, kapsülleme ile ilgili tüm bu teori, bir kişi özellikler oluşturduğunda (veya Java'da çiftleri aldığında / ayarladığında) ve tüm alanları doğrudan ortaya koyar koymaz başarısız olur, bu da sınıfları zaten alanlara erişiyormuş gibi bağlanmış hale getirir.

* Kapsülleme çeşitleri hakkında açıklama için Abel'ın mükemmel cevabına bakınız.


3
get/setYöntemler sağlandıktan sonra başarısız olduğunu düşünmüyorum . Erişimci yöntemleri hala bir soyutlamayı korur (kullanıcının arkasında bir alan olduğunu veya mülkün arkasında hangi alanların olabileceğini bilmesine gerek yoktur). Örneğin, bir Complexsınıf yazıyorsak , kutupsal koordinatları almak / ayarlamak için özellikleri ve Kartezyen koordinatları için başka bir get / set özelliğini gösterebiliriz. Sınıfın altında hangisini kullandığı kullanıcı tarafından bilinmemektedir (tamamen farklı bir şey bile olabilir).
Ken Wayne VanderLinde

5
@Ken: Maruz kalmanız gerekip gerekmediğini düşünmeden sahip olduğunuz her alan için bir özellik sağlarsanız başarısız olur.
Goran Jovic

@Goran İdeal olmayacağımı kabul etsem de, get / set erişimcileri temel alanlar değiştiğinde ek mantık eklemenize izin verdiği için hala tamamen başarısız olmaz.
ForbesLindesay

1
"Çünkü kapsülleme amacı farklı kod parçalarının karşılıklı bağımlılığını azaltmaktır" >> no. Kapsülleme aynı zamanda örnek-kapsülleme anlamına da gelebilir, dile veya düşünce okuluna bağlıdır. OO'nun en kesin seslerinden biri olan Bertrand Meyer, bunu varsayılan olarak bile düşünüyor private. İsterseniz şeyler hakkındaki görüşüm için cevabımı kontrol edebilirsiniz;).
Abel

@Abel: Cevabımı sınıf kapsüllemeli dillere dayandım çünkü OP bunlardan birini sordu ve açıkçası onları tanıdığım için. Düzeltme ve yeni ilginç bilgiler için teşekkürler!
Goran Jovic

49

Oldukça bazı cevaplar zaten bu ilginç konuya eklenmiştir, ancak, bu davranışın neden olduğu için gerçek sebebi bulamadım . Bir deneyeyim:

Geri dön

80'lerde Smalltalk ve 90'ların ortasında Java arasında bir yerde nesne yönlendirme kavramı olgunlaştı. Başlangıçta sadece OO için mevcut bir kavram olarak düşünülmeyen (ilk olarak 1978'de bahsedilmiştir) bilgi gizleme, bir sınıfın tüm verileri (alanları) özel olduğu için tüm yöntemler herkese açık olduğundan Smalltalk'ta tanıtıldı. 90'larda OO'nun birçok yeni gelişimi sırasında Bertrand Meyer, OO kavramlarının çoğunu dönüm noktası Nesneye Dayalı Yazılım İnşaatı'nda (OOSC) resmileştirmeye çalıştı. , o zamandan beri OO kavramları ve dil tasarımı üzerinde (neredeyse) kesin bir referans olarak kabul edilen .

Özel görünürlük durumunda

Meyer'e göre, bir yöntem bir dizi sınıf için kullanılabilir olmalıdır (sayfa 192-193). Bu açıkça çok yüksek bir bilgi gizleme ayrıntısı verir, A ve B sınıfı ve tüm torunları için aşağıdaki özellik mevcuttur:

feature {classA, classB}
   methodName

Durumunda privatekendisinden şu diyor ki: açıkça kendi sınıfına görünür olarak bir tür bildirmek olmadan, Erişemediğiniz nitelikli çağrısında özellik (yöntem / alanındaki) olduğunu. Yani xbir değişkense x.doSomething()izin verilmez. Tabii ki, sınıf içinde kalifiye olmayan erişime izin verilir.

Başka bir deyişle: aynı sınıfın bir örneğiyle erişime izin vermek için, söz konusu sınıfın yöntem erişimine açıkça izin vermeniz gerekir. Buna bazen özel-sınıf-sınıf-özel denir.

Programlama dillerinde örnek özel

Sınıf-özel bilgi gizleme yerine örnek-özel bilgi gizleme kullanan şu anda kullanılan en az iki dil biliyorum. Birincisi, Meyer tarafından tasarlanan ve OO'yu en uç noktalara taşıyan Eiffel. Diğeri Ruby, günümüzde çok daha yaygın bir dil. Ruby'de, "bu örneğe özel"private anlamına gelir .

Dil tasarımı için seçenekler

Derleyici için özel örneğe izin verilmesinin zor olduğu ileri sürülmüştür. Ben öyle düşünmüyorum, çünkü yöntemlere nitelikli çağrılara izin vermek veya vermemek nispeten basit. Özel bir yöntem doSomething()için izin verilirse vex.doSomething() , bir dil tasarımcısı özel yöntemler ve alanlar için yalnızca örnek örneği erişilebilirliğini etkili bir şekilde tanımlamıştır.

Teknik açıdan bakıldığında, şu ya da bu şekilde bir seçim yapmak için hiçbir neden yoktur (özellikle Eiffel.NET'in bunu IL ile yapabileceğini düşündüğünüzde, çoklu miras olsa bile, bu özelliği sağlamamanın doğal bir nedeni yoktur).

Tabii ki, bu bir zevk meselesi ve diğerlerinin de belirttiği gibi, özel yöntemlerin ve alanların sınıf düzeyinde görünürlüğü özelliği olmadan bazı yöntemlerin yazılması daha zor olabilir.

C # neden yalnızca sınıf kapsüllemeye izin verir, örnek kapsüllemeye izin vermez

İnternet kapsamalarına örnek kapsülleme (bazen bir dilin sınıf düzeyinde aksine erişim düzenleyicileri tanımladığı gerçeğine atıfta bulunmak için kullanılan bir terim) bakarsanız, kavram genellikle kaşlarını çatar. Bununla birlikte, bazı modern dillerin, en azından özel erişim değiştirici için örnek kapsülleme kullandığını düşünerek, bunun modern programlama dünyasında olabileceğini ve kullanılabileceğini düşünmenizi sağlar.

Ancak, C #, kuşkusuz dil tasarımı için C ++ ve Java'ya en sıkı baktı. Eiffel ve Modula-3 de resimde yer alırken, Eiffel'in birçok özelliği göz önüne alındığında (çoklu kalıtım) özel erişim değiştiricisine geldiğinde Java ve C ++ ile aynı yolu seçtiklerine inanıyorum.

Neden Eric Lippert, Krzysztof Cwalina, Anders Hejlsberg veya C # standardında çalışan herhangi bir kişiyi ele geçirmeye çalışmanız gerektiğini gerçekten bilmek istiyorsanız . Ne yazık ki, açıklamalı C # Programlama Dili'nde kesin bir not bulamadım .


1
Bu, çok ilginç bir geçmişe sahip hoş bir cevap, çok ilginç, (nispeten) eski bir soruya cevap vermek için zaman ayırdığınız için teşekkürler
RichK

1
@RichK: Rica ederim, soruyu çok geç yakaladım sanırım, ama konuyu biraz derinliğe cevap verecek kadar ilgi çekici buldum :)
Abel

COM altında, "private", "instance-private" anlamına geliyordu. Bence bu bazı ölçülerdeydi çünkü sınıfın tanımıFoo etkili bir şekilde bir arayüz ve bir uygulama sınıfını temsil ediyordu; COM bir sınıf-nesne referansı kavramına sahip olmadığından - sadece bir arayüz referansı - bir sınıfın o sınıfın başka bir örneği olması garanti edilen bir şeye referans verebilmesinin hiçbir yolu yoktu. Bu arayüz tabanlı tasarım bazı şeyleri hantal yaptı, ama aynı içselleri paylaşmak zorunda kalmadan bir başkasının yerine geçebilecek bir sınıf tasarlayabiliyordu.
supercat

2
Mükemmel cevap. OP bu soruyu cevap olarak işaretlemeyi düşünmelidir.
Gavin Osborn

18

Bu sadece benim düşüncem, ama pragmatik olarak, bir programcı bir sınıfın kaynağına erişebiliyorsa, sınıf örneğinin özel üyelerine erişirken onlara makul bir şekilde güvenebileceğinizi düşünüyorum. Neden bir programcıyı sollarında onları krallığa anahtarlar verdiğinizde sağ eline bağlarsınız?


13
Bu argümanı anlamıyorum. Diyelim ki bir program üzerinde çalışıyoruz diyelim sen sadece geliştirici ve EVER kütüphaneleri kullanmak istiyorsunuz teksin, kaynak koduna erişebilir çünkü HER üye herkese açık hale bu durumda diyorsun?
aquinas

@aquinas: bu oldukça farklı. Her şeyi herkese açık hale getirmek korkunç programlama uygulamalarına yol açacaktır. Bir türün diğer örneklerinin özel alanlarını görmesine izin vermek çok dar bir durumdur.
Igby Largeman

2
Hayır, her üyeyi halka açmayı savunmuyorum. Cennetler hayır! Benim argümanım, eğer zaten kaynaktaysanız, özel üyeleri, nasıl kullanıldıklarını, istihdam edilen sözleşmeleri vb. Görebiliyorsunuz, o zaman neden bu bilgiyi kullanamıyorsunuz?
FishBasketGordo

7
Bence düşünme şekli hala tür açısından. Türün üyeleriyle düzgün bir şekilde başa çıkması güvenilmezse, ne yapabilirim? ( Normalde , etkileşimleri gerçekten kontrol eden bir programcı olurdu, ancak kod oluşturma araçlarının bu çağında, her zaman böyle olmayabilir.)
Anthony Pegram

3
Sorum gerçekten güven değil, daha çok gereklilik. Güvenlere yönelik iğrenç şeylere yansımayı kullanabileceğiniz zaman güven tamamen önemsizdir. Merak ediyorum, kavramsal olarak neden ayrıcalıklara erişebiliyorsun. En iyi uygulamalar durumundan ziyade mantıklı bir neden olduğunu varsaydım.
RichK

13

Bunun nedeni eşitlik kontrolü, karşılaştırma, klonlama, operatör aşırı yüklemesi ... Örneğin karmaşık sayılara operatör + uygulamak çok zor olurdu.


3
Ancak bahsettiğiniz her şey bir tür gerektirir.Başka bir türün değerini ALMA. Diyorum ki: Özel devletimi incelemek mi istiyorsun? Güzel, devam et. Özel durumumu ayarlamak ister misin ? Olmaz dostum, kendi lanet halini değiştir. :)
aquinas

2
@aquinas Bu şekilde çalışmıyor. Alanlar, alanlardır. Yalnızca olarak bildirildiklerinde salt okunurdurlar readonlyve bu, bildirme örneği için de geçerlidir. Açıkçası, bunu yasaklamak için belirli bir derleyici kuralı olması gerektiğini iddia ediyorsunuz, ancak bu kuralların her biri C # ekibinin belirtmesi, belgelemesi, yerelleştirmesi, test etmesi, sürdürmesi ve desteklemesi gereken bir özelliktir. Zorlayıcı bir fayda yoksa neden yapsınlar ki?
Aaronaught

@Aaronaught'a katılıyorum: derleyicideki her yeni spesifikasyonun ve değişikliğin uygulanması ile ilgili bir maliyet var. Belirlenmiş bir senaryo için bir Klonlama yöntemi düşünün. Elbette, bunu özel bir kurucu ile gerçekleştirmek isteyebilirsiniz, ancak belki bazı senaryolarda mümkün / tavsiye edilemez.
Lorenzo Dematté

1
C # takımı? Sadece HERHANGİ bir dildeki olası teorik dil değişikliklerini tartışıyorum. "Zorlayıcı bir fayda yoksa ..." Bence bir fayda olabilir . Herhangi bir derleyici garantisinde olduğu gibi , birisi bir sınıfın sadece kendi durumunu değiştirmesini garanti etmeyi yararlı bulabilir.
aquinas

@aquinas: Özellikler , birçok veya çoğu kullanıcı için yararlı olduğu için uygulanmaktadır - bazı yalıtılmış durumlarda yararlı olabileceğinden değil .
Aaronaught

9

Her şeyden önce, özel statik üyelere ne olurdu? Bunlara yalnızca statik yöntemlerle erişilebilir mi? Kesinlikle bunu istemezsiniz, çünkü o zaman kendinize erişemezsiniz const.

Açık sorunuzla ilgili StringBuilderolarak, kendi örneklerinin bağlantılı bir listesi olarak uygulanan a örneğini düşünün :

public class StringBuilder
{
    private string chunk;
    private StringBuilder nextChunk;
}

Kendi sınıfınızın diğer örneklerinin özel üyelerine erişemiyorsanız, aşağıdaki ToStringgibi uygulama yapmanız gerekir :

public override string ToString()
{
    return chunk + nextChunk.ToString();
}

Bu işe yarayacak, ama O (n ^ 2) - çok verimli değil. Aslında, bu muhtemelen StringBuilderilk etapta bir sınıf sahibi olma amacını yener . Eğer varsa olabilir kendi sınıfın diğer örneklerinin özel üyelerine erişmesi, Uygulayabileceğiniz ToStringuygun uzunlukta bir dize oluşturarak ve ardından dizede onun uygun yere her parçanın güvenli olmayan kopyasını yaparak:

public override string ToString()
{
    string ret = string.FastAllocateString(Length);
    StringBuilder next = this;

    unsafe
    {
        fixed (char *dest = ret)
            while (next != null)
            {
                fixed (char *src = next.chunk)
                    string.wstrcpy(dest, src, next.chunk.Length);
                next = next.nextChunk;
            }
    }
    return ret;
}

Bu uygulama O (n) 'dir ve bu onu çok hızlı yapar ve yalnızca sınıfınızın diğer örneklerinin özel üyelerine erişiminiz varsa mümkündür .


Evet, ancak bazı alanları dahili olarak göstermek gibi başka yollar yok mu?
MikeKulls

2
@Mike: Bir alanı daha az özel internalkılan gibi göstermek ! Sonunda sınıfınızın iç bileşenlerini montajındaki her şeye maruz bırakırsınız.
Gabe

3

Bu birçok dilde mükemmel bir şekilde meşrudur (biri için C ++). Erişim değiştiriciler OOP'taki kapsülleme prensibinden gelir. Fikir dışarıya erişimi kısıtlamak , bu durumda dışarıdaki diğer sınıflardır. Örneğin, C # içindeki herhangi bir yuvalanmış sınıf, ebeveynlerinin özel üyelerine de erişebilir.

Bu bir dil tasarımcısı için bir tasarım seçimidir. Bu erişimin kısıtlanması, varlıkların izolasyonuna fazla katkıda bulunmadan çok yaygın bazı senaryoları son derece karmaşık hale getirebilir.

Burada benzer bir tartışma var


1

Verilerin her örneğe özel olduğu başka bir gizlilik düzeyi ekleyemememizin bir nedeni olduğunu düşünmüyorum. Aslında bu, dile güzel bir bütünlük hissi bile verebilir.

Ama gerçek uygulamada, gerçekten bu kadar yararlı olacağından şüpheliyim. Belirttiğiniz gibi, her zamanki özelliğimiz, eşitlik kontrolleri ve bir Türün birden çok örneğini içeren diğer birçok işlem için yararlıdır. Yine de, veri soyutlamasını koruma konusundaki görüşünüzü seviyorum, çünkü bu OOP'ta önemli bir nokta.

Her yerde, erişimi bu şekilde kısıtlama yeteneği sağlamak, OOP'ye eklemek için güzel bir özellik olabilir diye düşünüyorum. Gerçekten bu kadar faydalı mı? Hayır derim, çünkü bir sınıf kendi koduna güvenebilmelidir. Bu sınıf özel üyelere erişebilen tek şey olduğundan, başka bir sınıfın örneğiyle uğraşırken veri soyutlamasına ihtiyaç duymak için gerçek bir neden yoktur.

Elbette, kodunuzu her zaman özel örneklere uygulanmış gibi yazabilirsiniz . get/setVerilere erişmek / verileri değiştirmek için normal yöntemleri kullanın . Sınıf dahili değişikliklere tabi tutulabilirse, bu muhtemelen kodu daha yönetilebilir hale getirir.


0

Yukarıda verilen harika cevaplar. Bu sorunun bir kısmının, kendi içinde bir sınıfın somutlaştırılmasına ilk etapta bile izin verildiği gerçeğini ekleyeceğim. O zamandan beri özyinelemeli bir mantık için "for" döngüsünde, örneğin, özyinelemeyi sonlandırmak için mantığınız olduğu sürece bu tür bir hile kullanmak gerekir. Ancak, böyle bir döngüler oluşturmadan aynı sınıfı kendi içinde başlatmak veya geçirmek, yaygın olarak kabul edilen bir programlama paradigması olmasına rağmen, mantıksal olarak kendi tehlikelerini yaratır. Örneğin, bir C # Sınıfı varsayılan yapıcısında kendisinin bir kopyasını başlatabilir, ancak bu herhangi bir kuralı ihlal etmez veya nedensel döngüler oluşturmaz. Neden?

BTW .... aynı sorun "korunan" üyeler için de geçerlidir. :(

Programlama paradigmasını tam olarak kabul etmedim, çünkü çoğu programcının bu sorun yükselene ve insanları karıştırıncaya ve özel üyelere sahip olmanın tüm nedenine meydan okuyana kadar tam olarak kavramadığı bir dizi sorun ve riskle birlikte geliyor.

C # "garip ve tuhaf" yönü henüz iyi programlama deneyim ve beceri ile ilgisi yoktur, ama sadece hileler ve tuzakları bilmek ..... bir araba üzerinde çalışmak gibi bir nedenidir. Kuralların kırılması gerektiği iddiası bu, herhangi bir bilgisayar dili için çok kötü bir model.


-1

Bana öyle geliyor ki, veriler aynı türden diğer örneklere özel olsaydı, artık aynı tür olmayacaktır. Diğer örneklerle aynı şekilde davranmıyor veya aynı davranmıyor gibi görünüyor. Davranış, bu özel dahili verilere dayanarak kolayca değiştirilebilir. Bence bu sadece karışıklık yaratacaktı.

Kısacası, kişisel olarak, bir temel sınıftan türetilen yazma sınıflarının, 'örnek başına özel verilere sahip olmak' ile tanımladığınız benzer işlevleri sunduğunu düşünüyorum. Bunun yerine, 'benzersiz' tip başına yeni bir sınıf tanımınız vardır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.