我想知道如何在课堂上有条件地隐藏数据。 例如,假设我有一个名为Car的类,它有三个字段: 发动机,仪表读数和里程。
我还有其他三个实体:Driver,Mechanic和Passenger。 现在我想要的是:
驱动程序应该只能访问里程(而不是引擎和MeterReading)
机械师应该只能访问引擎和里程(而不是MeterReading)
乘客应该只能访问MeterReading(而不是引擎和里程)
实现这个的最好方法是什么..(不用基于if语句的整个逻辑)?
任何想法的人?
感谢。
答案 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。