我有一个类需要以某种方式封装某些功能。
我在想一个嵌套类,并将该功能加上一些状态。 这两个类之间的关系是一对一的。
访问外部类成员变量或方法的问题应该声明它们static
,我不想要它。另一种解决方案是将外部类的引用传递给内部类。
我的问题的最佳做法是什么?
答案 0 :(得分:1)
虽然我不会说嵌套类是邪恶的,但它们当然可能是“恶作剧”,并且嵌套类将解决的问题很少,无法以不同方式或更优雅地解决
所以这取决于你的具体情况,但有些事情需要考虑:
嵌套类是否公开可见?由于消费者必须使用语法来引用嵌套类型,因此这些方法很难实现:OuterType + InnerType
源文件平均变大,难以阅读和推理(虽然可以通过部分类的策略性使用来减轻这种情况)。
Visual Studio中的代码分析会大声抱怨公共嵌套类(框架设计指南人员认为它们不是很好的形式),所以如果你使用FxCop,你需要做出例外。< / p>
如果您发布更多细节,我们可能会提供更详细的指导。
答案 1 :(得分:1)
我们在6个月前就遇到过完全相同的问题,但出于不同的原因。我们有大约20个“普通”课程和一个巨大的木星大小的课程,这种课程方式,方式,方式太多,需要分解。
除了父母之外,我们实际上还需要两个孩子,两个孩子与父母一对一的关系。
第一次尝试(确实有效)使用了旧学校模式,在每个孩子的构造函数中传递'this'的引用,然后使用.Parent方法导航回来。由于GC问题,这是一场噩梦,我们在短时间内寻找更好的解决方案。
最好的解决方案(今天仍在使用)是简单地接受父类的类型的引用,这些类是需要查询父级的子方法。这非常好用,GC喜欢它,并且一切都按预期实例化和释放。代码更易于管理,组织更有条理,现在我们很高兴我们能及时投入。
所以,这是我的建议:
Parent
|
+-Child1
|
+-Child2
使用Child对象的方法仅在需要它的方法中接受对父类的引用。
它实际上与开发ADO.Net的方式非常相似,独立的对象在需要的方法中接受彼此的引用。
答案 2 :(得分: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();
}
}
但我不确定这是不是一个好主意?!