2011-01-06 71 views
3

我有一个类需要某种功能以某种方式进行封装。一对一映射类的嵌套类型或其他解决方案

我想到一个嵌套类,并将该功能加上一些状态。 这两个类之间的关系是一对一的。

访问他们应被宣布static,我不希望它的外部类的成员变量或方法的问题了。另一种解决方案是将外部类的引用传递给内部类。

我的问题最佳做法是什么?

+1

你能告诉我们你到目前为止? – 2011-01-06 03:39:09

+0

内部类是一种与外部类的数据一起工作的数据处理类。我需要访问外部类的所有内容,但仍以某种方式进行封装。也许将这个功能定义为一个新类不是一个好主意。 – Xaqron 2011-01-06 03:47:33

回答

0
using System; 

class OuterType 
{ 
    private static OuterType _instance; 

    public OuterType() 
    { 
     _instance = this; 
    } 

    private String Message 
    { 
     get { return "Hello from OuterType"; } 
    } 

    public void testInnerType() 
    { 
     InnerType innerType = new InnerType(); 
     Console.WriteLine(innerType.FormattedOutertMessage); 
    } 

    private class InnerType 
    { 
     private readonly OuterType _outerType = _instance; 

     public String FormattedOutertMessage 
     { 
      get { return _outerType.Message.ToUpper(); } 
     } 
     // InnerType doesn't need to dispose any object of OuterType. 
    } 
} 

然后,它的工作原理是这样的:

class Program 
{ 
    static void Main(string[] args) 
    { 
     OuterType outerType = new OuterType(); 
     outerType.testInnerType(); 
     Console.ReadKey(); 
    } 
} 

但我不知道这是一个好主意或没有?!

1

虽然我不尽可能地说,嵌套类是邪恶的,他们当然可以是“恶作剧”,并有极少数的问题,即在嵌套类将解决无法区别以上去解决典雅。

所以这真的取决于你的具体情况,但是有些事情要考虑的是:

  1. 是嵌套类将是公开可见?由于消费者必须使用语法来指代嵌套类型,所以这些都很笨拙:OuterType + InnerType

  2. 源文件平均变得更大,并且难以阅读和推理(尽管这可以通过战略使用来减轻部分班级)。

  3. Visual Studio中的代码分析将大声抱怨公共嵌套类(它们不被框架设计指南人认为是好的形式),所以如果您使用FxCop,则需要制定例外。

如果您发布一些更具体的细节,我们可能会提供更详细的指导。

+0

如果我把它带到这里,我的场景会非常复杂,可能没有人会阅读这样的问题。我尽可能简化了这个概念。如何在可以访问所有原始类的同时封装一组功能? – Xaqron 2011-01-06 04:15:03

1

我们在6个月前的问题完全相同,但是原因不同。我们有大约20个“常规”班,还有一个木星级的巨型班级,这种班级太过分了,需要分解。

除了父母之外,我们实际上需要两个孩子,两个孩子与父母的关系为1对1。

第一次尝试(其中没有工作)适用于每个孩子的构造函数传递的“这”的引用,然后使用.Parent方法可用于浏览备份的老派模式。由于GC问题,这是一场噩梦,我们在短时间内寻找了更好的解决方案。

最好的解决方案(今天仍然使用)是在需要查询父项的子项的方法中接受父类类的引用。这很有效,GC非常喜欢它,并且所有的东西都可以像预期的那样实例化和释放。代码更易于管理,而且组织性更强,我们现在很高兴我们能够及时做出投资。

所以,这将是我的建议:

Parent 
| 
+-Child1 
| 
+-Child2 

与孩子接受对象的父类的引用的方法只在需要它的方法。

它实际上很像ADO的方式。净开发,与独立的对象,在需要的方法接受彼此的引用。