首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对不同类的属性进行不同的访问

对不同类的属性进行不同的访问
EN

Stack Overflow用户
提问于 2012-01-24 19:53:13
回答 3查看 348关注 0票数 4

我有一个基础(抽象)类Component。我想控制对派生类的属性的访问,这样每个人都有读访问权限,但写访问只允许某些类访问。

这些“特定类”是目前实现抽象基类MessageHandler<TMessage>的任何东西。理想情况下,我也希望实现IMessageHandler的类能够获得访问权限,但我认为这会使要求变得有点困难。

这将在xbox上运行,因此我希望避免创建临时对象(例如只读副本)。我还希望最小化方法调用的数量,以获得读/写的值。

Component类和MessageHandler<TMessage>类目前在它们自己的程序集中,在使用我的应用程序接口时,这两个程序集都将被其他项目引用。

我猜我将不得不以某种方式改变我的模型,但我无法理解它。

代码语言:javascript
运行
复制
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
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-24 20:36:28

隔离(基于您提出的问题和我所理解的)是基于基类定义(如果有的话)。这意味着隔离应该从它开始。

或者,如果您说,如果某个class X实现了MessageHandler,那么它应该能够以多种方式作用于class Y类型对象。这意味着在class YMessageHandler之间有一个艰难的关系。

这会让我觉得你可以这样做:

DerivedComponentA

  • in MessageHandler属性上的公共反射定义泛型protected SetProperty(Component compo, string propertyName, object propertyValue)并使用反射设置required属性。

这样,在任何Component派生类上设置属性的唯一可能方法就是使用MessageHandler方法,因此只有那些派生它的人才能使用。对于其余的可用类型,您只需提供public get (只读) poperty来读取数据。

希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2012-01-24 20:03:40

我建议你在这里使用接口。具有一个具有只读属性的只读接口IReadOnlyComponent和一个为该属性添加Set方法的IWritableComponent : IReadOnlyComponent

抽象基类Component实现了IWritableComponent,因此具有只读属性和Set方法。

将组件实例作为IWritableComponent仅传递给从MessageHandler继承的类,或者实现IMessageHandler并将其作为IReadOnlyComponent传递给所有其他类。

票数 1
EN

Stack Overflow用户

发布于 2012-01-24 19:59:24

你能不能像这样控制setter:

代码语言:javascript
运行
复制
public string Prop {
  get { return ...; }
  set { if (!(this is MessageHandler<TMessage>)) 
           throw Exception(...);
        .... setter code;
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8986370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档