2010-02-01 26 views
12

Ham veri kümelerini içeren A sınıfı ve verilen veriyi A'da görünür hale getirmek için bu verilerin yeniden düzenlenmiş sürümünü (GUI'ye hazır) içeren B sınıfı verildi. B. A sınıfındaki ham veriler, özel üyelerde açıkça yer almaktadır. Bu verileri, B + + arkadaş sınıfları yöntemine benzer bir şeyin kullanımıyla B'de görünür yapmak istiyorum.C# Arkadaş sınıfları ve OOP Kompozisyonu

Buna nasıl yaklaşabilirim?

Teşekkür ederiz.

cevap

10

Kesinlikle konuştuğunuzda, verileri gösterebileceğiniz belirli bir sınıfı (veya sınıf listesini) tanımlayamazsınız. Bununla birlikte, private yerine internal erişim değiştiricisini kullanabilirsiniz, bu da üyeleri aynı derlemede herhangi bir sınıfa sunar.

söyleniyor

, sen güçlü (Sana açığa planlıyoruz tahmin ediyorum ne olduğunu) yerine tarlalardan daha özellikleri aracılığıyla bu üyeleri açığa düşünün gerekir. Bunu yapmak, sınıfın bu bilginin diğer sınıflara nasıl açık olabileceğini ve başka bir sınıf veriyi değiştirdiğinde ne olursa olsun ne olacağını açıklayacaktır.

+1

'internal' + özelliklerinde = güvenli .. bu size yardımcı olabilir olabilir. –

+0

Bu, * dahili özelliklerin * veya büyük olasılıkla bir * iç arabirim * için bir durum gibi gözüküyor. A kaynak kodunun A, B'ye aşırı bağlanmadan özel üyelerin bazılarına erişmesine izin veriyor. – LBushkin

+1

@LBushkin: Dahili arabirim kesinlikle bir çözümdür, ancak aslında onu uygulayan bir sınıftan daha fazlası olmayacaksa gereksiz görünmektedir. –

1

Hem bir montajda hem de A'daki alanları "iç" olarak işaretleyebilirsiniz. Daha fazla OO yaklaşımı, tipik olarak basit özellikler aracılığıyla verilere (veya verilerin bir alt kümesine) erişime izin veren bir dizi ortak yöntem sağlamaktır.

0

Yapınıza bağlı olarak Kısmi sınıfları kullanabilirsiniz. Bu, Veri ve UI'nin aslında her ikisi de aynı sınıfta olduğu anlamına gelir, ancak bunları farklı dosyalarda bulundurursunuz.

Bu sizin için işe yaramazsa, alternatif olarak iç kapsam değişkenleri veya UI'nin daha genel bir şekilde temsil ettiği Veri Kümeleriyle çalışabilirsiniz. Bu değerler erişilemez hale böylece

0

Eski yöntemi (kelime oyunu amaçlı) basit GetValue tanımlamak olacaktır() ve SetValue() fonksiyonları C#, bu fonksiyonların kullanılmadan bu değer iade etmek için bu fonksiyonlar özellikler olarak adlandırılan önceden tanımlanmış üyelerdir. Diğerleri sadece internal değiştirici kullanmak, benden önce belirttiğimiz gibi

class TestMethod{ 
private int Secret; 

get { return Secret;} 
set { Secret = value;} 
} 

diğer yöntem sağlamaktır.

7

public class A 
{ 
    public A() { } 

    public string AccessData(object accessor) 
    { 
     if (accessor is B) 
      return "private_data"; 
     else 
      throw new UnauthorizedAccessException(); 
    } 
} 

public class B 
{ 
    public B() { } 

    private void AccessDataFromA() 
    { 
     Console.WriteLine(new A().AccessData(this)); 
    } 
} 
+2

Bu, 'arkadaşın' semantiklerini uygulamak için akıllıca bir yoldur.Ben her zaman 'friend' kullanmayın, ama ben, bu accessor desen kullanırım :-) –

+1

Ama bu sadece derleme zaman güvenliği kırıyor. Ben hemen hemen herhangi bir sınıf 'AccessData' için kullanabilir ve derleyici şikayet olmaz. –