2010-10-14 14 views
6

nasıl uygulanır? Sınıftaki verileri koşullu olarak nasıl gizleyebileceğini merak ediyordum. Örneğin, Motor, Metre Okuma ve Kilometre olmak üzere üç alanı olan bir Araba sınıfım olduğunu varsayalım.Koşullu kapsülleme C#

Sürücü, Mekanik ve Yolcu: adlı başka üç varlığım var.

bir sürücü sadece Kilometre (ve Engine ve MeterReading)

Bir Mekanik sadece Motor ve Kilometre (ve MeterReading değil) erişmek mümkün olmalıdır

erişmek mümkün olmalıdır: Şimdi ne istememizdir

bir Yolcu yalnızca (eğer başka tablolarda bütün mantığı dayandırılması olmadan) MeterReading (ve Motor ve Kilometre)

Bunun uygulamak için en iyi yol olabilir .. erişmek mümkün olmalıdır?

Fikriniz var mı?

Teşekkürler.

cevap

4

explicit interface implementation kullanırım. Nesne türüne erişildiğinde arabirimin uygulanmasını gizler. Uygulamaya sadece arayüzle erişilirken erişilebilir.

interface IUsableByPassenger 
{ 
    MeterReading MeterReading 
    { 
     get; set; 
    } 
} 

interface IUsableByDriver 
{ 
    Mileage Mileage 
    { 
     get; set; 
    } 
} 

interface IUsableByMechanic : IUsableByDriver 
{ 
    Engine Engine 
    { 
     get; set; 
    } 
} 

class Car : IUsableByMechanic, IUsableByPassenger 
{ 
    Mileage IUsableByDriver.Mileage 
    { 
     // implement mileage access 
    } 

    Engine IUsableByMechanic.Engine 
    { 
     // implement engine access 
    } 

    MeterReading IUsableByPassenger.MeterReading 
    { 
     // implement engine access 
    } 
} 

class Mechanic 
{ 
    public Mechanic(IUsableByMechanic usable) 
    { 
     // usable.MeterReading is not here 
    } 
} 
+0

Tabii ki bu sadece kodlama sırasında kazalara karşı koruyucular olduğunu, ancak müşteri kodunun 'Araba' ve sonra 'IUsableByMechanic' için' IUsableByPassenger 'örneğini atayabileceğinden, düşmanca müşterilere karşı bir güvenlik önlemi olmadığını belirtmek gerekir. ve diğerleri. – Timwi

+0

Elbette, ancak bir şekilde maruz kalmadan daha fazlasını yapabilen herhangi bir nesneyi açığa çıkarırken bundan kaçınmanın bir yolu yoktur. Bir tür bulmak için yansımayı her zaman kullanabilir, özel kişileri okuyabilirsiniz. – NOtherDev

+0

@A: Güvenilmeyen istemci kodunun yansımayı kullanmasını engellemek, ancak basit bir dökümü engellemek mümkün değildir. – Timwi

12

Akla gelen ilk fikir, Car sınıfınızın, birbirinizin sınıfının Car sınıfınızla etkileşimde bulunmak için kullanabileceği 3 farklı arabirim olmasını sağlamak olacaktır.

Örneğin

, (ve benim isimleri kesinlikle üzerine geliştirilebilir ama fikir almalısınız) gibi olabilir IDriverAccess arayüzü aşağıdaki gibidir: aşağıdaki gibi

public interface IDriverAccess 
{ 
    double Mileage { get; } 
} 

IMechanicAccess arayüz olabilir:

Ve benzeri. Araç sınıfınız daha sonra bu arabirimleri uygulayabilir, ancak sürücü, mekanik, & yolcuları için sınıflar, nesnelerle etkileşimde bulunmak için yalnızca arayüzleri kullanacaktır.

public interface IDriviableCar 
{ 
    object Mileage { get; } 
} 

public interface IRepairableCar 
{ 
    object Engine { get; } 
} 

public interface IHirableCar 
{ 
    object MeterReader { get; } 
} 

public class Car : IDriviableCar, IRepairableCar, IHirableCar 
{ 
    private object _mileage; 

    private object _engine; 

    private object _meterReader; 

    public object Mileage 
    { 
     get { return _mileage; } 
    } 

    public object Engine 
    { 
     get { return _engine; } 
    } 

    public object MeterReader 
    { 
     get { return _meterReader; } 
    } 
} 

Ve her kişinin araba erişmek için arayüz kullanalım:

public Car : IDriverAccess, IMechanicAccess, IPassengerAccess 
{ 
    // implement the interfaces 
} 
+0

Zamanında beni yendin! – Aliostad

+3

Tabii ki, bu sadece kodlama sırasında kazalara karşı koruyucular olduğunu, ancak müşteri kodunun hala 'IDriverAccess' aracına '' Car '' dökümü yapabildiği ve her şeye erişebildiği için, düşmanca müşterilere karşı bir güvenlik önlemi olmadığı belirtilmelidir. – Timwi

+1

Ama bu arayüzleri örtülü olarak uyguladığınızda, 'Makinenin' dışında 'Araba' sınıfı ya da 'Sürücü' (yani kötü hırsız tarafından erişildiğinde) hala her şeyi açığa çıkaracaktır. – NOtherDev

2

Ben bu arabirimler yaratacak.

+0

Yukarıdaki gibi - bu arabirimleri örtük olarak uygularken, 'Araba' sınıfı 'Mekanik' veya 'Sürücü' (yani kötü hırsızlar tarafından erişildiğinde) dışında her şey ortaya çıkar. – NOtherDev

+0

Ama buna erişmemeleri gerekiyor ve bu anahtar. – Aliostad

+0

Tabii ki, bu sadece kodlama sırasında kazalara karşı koruyucular olduğunu, ancak müşteri kodunun hala 'IDrivableCar' örneğini 'Araba' haline getirip her şeye erişebildiğinden, düşmanca müşterilere karşı bir güvenlik önlemi olmadığını belirtmek gerekir. – Timwi

2

yapmak sınıfı Araba uygulanan arayüzleri IEngine, ImaterReading ve böylece: En örnekte. Her varlığa yalnızca belirtim arabirim erişimi verin. , bir sürücünün sadece IMilage erişimi, mekanik bir IMilage ve IEngine olduğunu söyler.

+0

neden bu downvoted? – Arseny

+0

Üzgünüm .. bu yanlışlıkla oldu! – Sennin