代码之家  ›  专栏  ›  技术社区  ›  me.at.coding

仅允许从特定类/实例设置属性

  •  3
  • me.at.coding  · 技术社区  · 14 年前

    假设我有两个类A和B,其中B具有属性BProperty1和BProperty2。

    • 属性BProperty1只能由类A设置(无论哪个实例)
    • 属性BProperty2只能由a类的具体实例设置(对该实例的引用可以存储在BProperty1上)。

    有没有可能实现这样的事情,有没有可能的模式呢?请注意A和B是独立的,它们都不是从另一个派生出来的!我用的是C和WPF。谢谢你的提示!

    编辑 举个例子:

    想象一下一辆高级轿车和一辆高级轿车。无论何时将CarDoor添加到汽车,CarDoors属性AssociatedCar都会设置为其指定的汽车,因为以后需要使用此引用。但是在调用AddCarDoor(door)时,如何确保AssociatedCar属性不是由用户设置的,而是由Car类设置的呢?

    class Car
    {
        private List<CarDoor> _carDoors = new List<CarDoor>();
    
        public Car()
        {
    
        }
    
        public void AddCarDoor(CarDoor door)
        {
            // Add the door to the car
            _carDoors.Add(door);
    
            // Save a reference to the car assigned to the door
            door.AssociatedCar = this;
        }
    }
    
    
    class CarDoor
    {
        public Car AssociatedCar;
    
        public CarDoor()
        {
    
        }
    }
    
    4 回复  |  直到 14 年前
        1
  •  1
  •   badpanda    14 年前

    Edit2:另外,在car和car door之间有一个双向关联(即car door有一个关联的car,car有关联的car doors)是有点多余的。我不明白为什么您需要它-只需为car door设置一个public get属性,这样您就可以在car类之外使用该数据。

    例子。。。

    Class Car
    {
        private List<CarDoor> carDoors;
    
        Car()
        {
             this.carDoors = new List<CarDoor>();
        }
    
        public List<CarDoor> getCarDoors
        {
             return this.carDoors;
        }
    }
    
        2
  •  1
  •   Dan Bryant    14 年前

    以下是一个稍微转移职责以创建双向依赖关系的设计:

    class CarFactory
    {
        public Car BuildCar()
        {
            return new Car(BuildDoor);
        }
    
        public CarDoor BuildDoor(Car car)
        {
            return new CarDoor(car);
        }
    }
    
    class Car
    {
        private List<CarDoor> _carDoors = new List<CarDoor>();
    
        public Car(Func<Car, CarDoor> buildDoor)
        {
            for (int i=0; i<4; i++)
                _carDoors.Add(buildDoor(this));
        }
    }
    
    
    class CarDoor
    {
        private Car _associatedCar;
    
        public CarDoor(Car associatedCar)
        {
            _associatedCar = associatedCar;
        }
    }
    

    但是,请注意,这种双向依赖性是其他问题的一个迹象。可能是卡多尔在做不该做的事情。也许汽车应该做这些事情,或者也许你已经包括了真正属于另一类完全的责任,如机械师。

        3
  •  1
  •   user348905 user348905    14 年前

    您可以将两者放在一个单独的项目/assembly/dll中,并在属性集上使用internal关键字。这样,程序集中的任何类都可以更改属性,但是由于您控制整个程序,因此可以确保只有Car可以这样做。

        4
  •  0
  •   Arseni Mourzenko    14 年前

    如果它是一个属性,您可以使用 System.Diagnostics.StackTrace 类)在属性设置器中。您只需要检查程序集和调用setter的类,如果它不是类a,则抛出异常。

    • 注意性能问题。