C# 不同类对属性的不同访问
我有一个基本(抽象)类C# 不同类对属性的不同访问,c#,access-modifiers,C#,Access Modifiers,我有一个基本(抽象)类组件。我想控制对派生类属性的访问,这样每个人都可以获得读访问权,但写访问权只能由某些类允许 这些“特定类”当前是实现抽象基类的任何东西MessageHandler。理想情况下,我还希望实现IMessageHandler的类能够获得访问权限,但我认为这会使要求更加严格 这将在xbox上运行,因此我希望避免创建临时对象(例如只读副本)。我还希望尽量减少方法调用的数量,以获得读/写到的值 组件类和MessageHandler类当前位于它们自己的程序集中,这两个类在使用my API
组件
。我想控制对派生类属性的访问,这样每个人都可以获得读访问权,但写访问权只能由某些类允许
这些“特定类”当前是实现抽象基类的任何东西MessageHandler
。理想情况下,我还希望实现IMessageHandler
的类能够获得访问权限,但我认为这会使要求更加严格
这将在xbox上运行,因此我希望避免创建临时对象(例如只读副本)。我还希望尽量减少方法调用的数量,以获得读/写到的值
组件
类和MessageHandler
类当前位于它们自己的程序集中,这两个类在使用my API时都将被其他项目引用
我猜我将不得不以某种方式改变我的模型,但我无法改变我的想法
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
}
}
公共抽象类组件
{
}
公共类派生组件A:组件
{
int属性{get;set;}
}
公共抽象类MessageHandler
{
}
公共类IntMsghandler:MessageHandler
{
无效点滴(DerivedComponentA DerivedComponentA)
{
derivedComponentA.property=5;//允许
}
}
公共类AnyClass//不继承MessageHandler,也不实现IMessageHandler
{
无效点滴(DerivedComponentA DerivedComponentA)
{
derivedComponentA.property=5;//不允许
}
}
您不能像这样控制设定器:
public string Prop {
get { return ...; }
set { if (!(this is MessageHandler<TMessage>))
throw Exception(...);
.... setter code;
}
}
公共字符串属性{
获取{return…;}
设置{if(!(这是MessageHandler))
抛出异常(…);
..设定器代码;
}
}
我建议您在这里使用接口。具有一个只读接口IReadOnlyComponent
,该接口具有只读属性和一个IWritableComponent:IReadOnlyComponent
,该接口为属性添加一个Set
方法。抽象基类
Component
实现IWritableComponent
,因此具有只读属性和Set
方法。仅将组件实例作为
IWritableComponent
传递给继承自MessageHandler
或实现IMessageHandler
的类,并将其作为IReadOnlyComponent
传递给所有其他类。隔离(基于您提出的问题和我理解的内容)是基于基类定义进行的(如果有的话)。这意味着隔离应该从它开始
或者,如果你说,如果一些classx
实现MessageHandler
应该能够以多种方式对classy
类型对象进行操作。我认为,这意味着
Y类
和MessageHandler
这让我觉得你可以做这样的事情:
- 只有public
才能获取get
DerivedComponentA
- 在
中定义一个通用的MessageHandler
并使用反射设置所需的属性受保护的SetProperty(组件compo、字符串propertyName、对象propertyValue)
组件
派生类上设置属性的唯一可能方法是使用MessageHandler
方法,因此仅对从该方法派生的类可用。对于其余可用类型,您仅提供用于读取数据的公共获取
(只读)权限
希望这能有所帮助。如果有什么不清楚的地方,请告诉我,我会编辑。您想限制访问的内容还不清楚。您想限制访问的属性在哪里?@Matten:这是非法的。您不能更改被覆盖成员的访问修饰符。您想要的似乎一开始就不是继承。对不起,我很抱歉我可能不清楚,属性在组件类上,而不是消息处理程序(尽管消息处理程序是要更改值的处理程序)。添加了代码。此外,理想情况下,我希望在编译时强制执行它(尽管不知道这有多现实)。