我有一个基础(抽象)类Component。我想控制对派生类的属性的访问,这样每个人都有读访问权限,但写访问只允许某些类访问。
这些“特定类”是目前实现抽象基类MessageHandler<TMessage>的任何东西。理想情况下,我也希望实现IMessageHandler的类能够获得访问权限,但我认为这会使要求变得有点困难。
这将在xbox上运行,因此我希望避免创建临时对象(例如只读副本)。我还希望最小化方法调用的数量,以获得读/写的值。
Component类和MessageHandler<TMessage>类目前在它们自己的程序集中,在使用我的应用程序接口时,这两个程序集都将被其他项目引用。
我猜我将不得不以某种方式改变我的模型,但我无法理解它。
public abstract class Component
{
}
public class DerivedComponentA : Component
{
int property {get; set;}
}
public abstract class MessageHandler<TMessage>
{
}
public class IntMsghandler : MessageHandler<int>
{
void DoThing(DerivedComponentA derivedComponentA)
{
derivedComponentA.property = 5; // Allowed
}
}
public class AnyClass // Doesn't inherit MessageHandler, or implement IMessageHandler
{
void DoThing(DerivedComponentA derivedComponentA)
{
derivedComponentA.property = 5; // Not Allowed
}
}发布于 2012-01-24 20:36:28
隔离(基于您提出的问题和我所理解的)是基于基类定义(如果有的话)。这意味着隔离应该从它开始。
或者,如果您说,如果某个class X实现了MessageHandler,那么它应该能够以多种方式作用于class Y类型对象。这意味着在class Y和MessageHandler之间有一个艰难的关系。
这会让我觉得你可以这样做:
仅DerivedComponentA
MessageHandler属性上的公共反射定义泛型protected SetProperty(Component compo, string propertyName, object propertyValue)并使用反射设置required属性。这样,在任何Component派生类上设置属性的唯一可能方法就是使用MessageHandler方法,因此只有那些派生它的人才能使用。对于其余的可用类型,您只需提供public get (只读) poperty来读取数据。
希望这能有所帮助。
发布于 2012-01-24 20:03:40
我建议你在这里使用接口。具有一个具有只读属性的只读接口IReadOnlyComponent和一个为该属性添加Set方法的IWritableComponent : IReadOnlyComponent。
抽象基类Component实现了IWritableComponent,因此具有只读属性和Set方法。
将组件实例作为IWritableComponent仅传递给从MessageHandler继承的类,或者实现IMessageHandler并将其作为IReadOnlyComponent传递给所有其他类。
发布于 2012-01-24 19:59:24
你能不能像这样控制setter:
public string Prop {
get { return ...; }
set { if (!(this is MessageHandler<TMessage>))
throw Exception(...);
.... setter code;
}
}https://stackoverflow.com/questions/8986370
复制相似问题