如何在C#中实现条件封装

时间:2010-10-14 11:56:55

标签: c# conditional encapsulation

我想知道如何在课堂上有条件地隐藏数据。 例如,假设我有一个名为Car的类,它有三个字段: 发动机,仪表读数和里程。

我还有其他三个实体:Driver,Mechanic和Passenger。  现在我想要的是:

驱动程序应该只能访问里程(而不是引擎和MeterReading)

机械师应该只能访问引擎和里程(而不是MeterReading)

乘客应该只能访问MeterReading(而不是引擎和里程)

实现这个的最好方法是什么..(不用基于if语句的整个逻辑)?

任何想法的人?

感谢。

4 个答案:

答案 0 :(得分:13)

我想到的第一个想法是让你的Car类实现3个不同的接口,其他类可以用来与你的Car类进行交互。

例如,(我的名字肯定可以改进,但你应该明白这一点),IDriverAccess接口可以如下:

public interface IDriverAccess
{
  double Mileage { get; }
}

IMechanicAccess界面可以如下:

public interface IMechanicAccess
{
  EngineObject Engine { get; set; }

  double Mileage { get; }
}

等等。然后你的汽车类可以实现这些接口,但是驱动程序,机制和&乘客只需使用接口与对象进行交互。

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

答案 1 :(得分:4)

我会使用explicit interface implementation。当对象按其类型访问时,它隐藏了接口的实现。只有通过接口访问时才能访问实现。在您的示例中:

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
    }
}

答案 2 :(得分:2)

我会创建这些接口:

    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; }
    }
}

让每个人使用界面访问汽车。

答案 3 :(得分:2)

make class Car实现了接口Engine,ImaterReading等。 仅为每个实体提供特定的接口访问权 说一个驱动器只有IMilage访问,机械师IMilage和IEngine。