实例化对象并在外部保护其属性

时间:2015-03-31 11:53:56

标签: c# asp.net

我目前有一个实例化另一个类的类,比如这个

public abstract class ResponseAdapter
{
    PingResult result = new PingResult();

    public PingResult Result 
    {
       get { return result; } 
    }
}

虽然我希望结果公开,但我不希望其内容在受保护环境之外更改。

我知道我可以为Result创建一个构造函数并使事情只读,但实例化PingResult的类会单独设置其属性。是否有任何关键字或技术可以让我在当前课程之外只读取PingResult的属性?

3 个答案:

答案 0 :(得分:2)

也许为PingResult创建一个包装器/代理类(例如PingResultWrapperResponseAdapter与其属性一起公开。对PingResultWrapper所做的任何修改都将通过该修改进行调整,因此您可以完全控制对包装的PingResult对象进行哪些更改。此外,最好让PingResultWrappedPingResult实现相同的接口,以便调用者可以更抽象地对待它(即不需要知道实现细节)。

答案 1 :(得分:0)

C#中没有任何内容可以提供您所询问的功能。

您可以考虑两种选择。

  1. 使PingResult不可变并公开它。缺点是没有人可以修改它。
  2. 使用一些不可变的抽象来展示PingResult。 I.e IPingResult接口,它不提供成员来改变状态。你仍然可以保留PingResult mutable,可用于在问题的当前类中修改它。
  3. 使用第二种方法,您可以选择将PingResult类标记为private,使其在类外无法访问,并将实例公开为IPingResult。这样,您可以确保只有ResponseAdapter可以修改PingResult,因为其他类甚至看不到setter;他们只能看到只读界面。

答案 2 :(得分:0)

添加一个只包含getter(IPingResult)的接口,并从中继承PingResult。

 public PingResult Result 
    {
       get { return result; } 
    }

将被更改为返回接口而不是类:

public IPingResult Result 
        {
           get { return result; } 
        }