我有一个类需要某种功能以某种方式进行封装。一对一映射类的嵌套类型或其他解决方案
我想到一个嵌套类,并将该功能加上一些状态。 这两个类之间的关系是一对一的。
访问他们应被宣布static
,我不希望它的外部类的成员变量或方法的问题了。另一种解决方案是将外部类的引用传递给内部类。
我的问题最佳做法是什么?
我有一个类需要某种功能以某种方式进行封装。一对一映射类的嵌套类型或其他解决方案
我想到一个嵌套类,并将该功能加上一些状态。 这两个类之间的关系是一对一的。
访问他们应被宣布static
,我不希望它的外部类的成员变量或方法的问题了。另一种解决方案是将外部类的引用传递给内部类。
我的问题最佳做法是什么?
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();
}
}
但我不知道这是一个好主意或没有?!
虽然我不尽可能地说,嵌套类是邪恶的,他们当然可以是“恶作剧”,并有极少数的问题,即在嵌套类将解决无法区别以上去解决典雅。
所以这真的取决于你的具体情况,但是有些事情要考虑的是:
是嵌套类将是公开可见?由于消费者必须使用语法来指代嵌套类型,所以这些都很笨拙:OuterType + InnerType
源文件平均变得更大,并且难以阅读和推理(尽管这可以通过战略使用来减轻部分班级)。
Visual Studio中的代码分析将大声抱怨公共嵌套类(它们不被框架设计指南人认为是好的形式),所以如果您使用FxCop,则需要制定例外。
如果您发布一些更具体的细节,我们可能会提供更详细的指导。
如果我把它带到这里,我的场景会非常复杂,可能没有人会阅读这样的问题。我尽可能简化了这个概念。如何在可以访问所有原始类的同时封装一组功能? – Xaqron 2011-01-06 04:15:03
我们在6个月前的问题完全相同,但是原因不同。我们有大约20个“常规”班,还有一个木星级的巨型班级,这种班级太过分了,需要分解。
除了父母之外,我们实际上需要两个孩子,两个孩子与父母的关系为1对1。
第一次尝试(其中没有工作)适用于每个孩子的构造函数传递的“这”的引用,然后使用.Parent方法可用于浏览备份的老派模式。由于GC问题,这是一场噩梦,我们在短时间内寻找了更好的解决方案。
最好的解决方案(今天仍然使用)是在需要查询父项的子项的方法中接受父类类的引用。这很有效,GC非常喜欢它,并且所有的东西都可以像预期的那样实例化和释放。代码更易于管理,而且组织性更强,我们现在很高兴我们能够及时做出投资。
所以,这将是我的建议:
Parent
|
+-Child1
|
+-Child2
与孩子接受对象的父类的引用的方法只在需要它的方法。
它实际上很像ADO的方式。净开发,与独立的对象,在需要的方法接受彼此的引用。
你能告诉我们你到目前为止? – 2011-01-06 03:39:09
内部类是一种与外部类的数据一起工作的数据处理类。我需要访问外部类的所有内容,但仍以某种方式进行封装。也许将这个功能定义为一个新类不是一个好主意。 – Xaqron 2011-01-06 03:47:33