3

我有一个类需要以某种方式封装一些功能。

我正在考虑一个嵌套类,并将该功能和一些状态放入其中。这两个类之间的关系是一对一的。

访问应该声明的外部类成员变量或方法的问题static,我不想要它。另一种解决方案是将外部类的引用传递给内部类。

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

4

3 回答 3

1

虽然我不会说嵌套类是邪恶的,但它们肯定是“恶作剧”,嵌套类可以解决的问题很少,不能以不同的方式或更优雅地解决。

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

  1. 嵌套类会公开可见吗?由于消费者必须使用语法来引用嵌套类型,因此这些方法很笨拙:OuterType+InnerType

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

  3. Visual Studio 中的代码分析会大声抱怨公共嵌套类(框架设计指南人员认为它们不是良好的形式),因此如果您使用 FxCop,则需要进行例外处理。

如果您发布更多细节,我们也许可以提供更详细的指导。

于 2011-01-06T04:03:41.353 回答
1

大约 6 个月前,我们遇到了完全相同的问题,但原因不同。我们有大约 20 个“常规”类和一个巨大的木星大小的类,它们做得太多了,需要分解。

我们实际上需要两个孩子,除了父母,两个孩子都与父母一对一的关系。

第一次尝试(确实有效)使用了在每个孩子的构造函数中传递“this”引用的老式模式,然后使用 .Parent 方法向上导航。由于 GC 问题,这是一场噩梦,我们在短时间内寻找更好的解决方案。

最好的解决方案(今天仍在使用)是在需要查询父级的子级方法中简单地接受父级类类型的引用。这工作得非常好,GC 喜欢它,并且一切都按预期实例化和释放。代码更易于管理,更有条理,我们现在真的很高兴我们投入了时间来完成它。

所以,这将是我的建议:

Parent
 |
 +-Child1
 |
 +-Child2

Child 对象的方法仅在需要它的方法中接受对父类的引用。

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

于 2011-01-06T06:04:17.677 回答
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();
    }
}

但我不确定这是否是个好主意?!

于 2011-01-06T13:13:59.020 回答