2

我正在使用带有一堆类的第三方程序集,以分层方式组织。CreateXxx()它们具有私有构造函数,并通过在另一个更高级别的类的实例上调用方法来实例化。在层次结构的顶部,使用了一个单例类。例如,应用程序代码如下所示:

TopClass top = TopClass.GetInstance();
SecondLevelClass secondLevel = top.CreateSecondLevelElement();
ThirdLevelClass thirdLevel = secondLevel.CreateThirdLevelElement();

类似地,终结是使用一种DeleteXxx()方法完成的,该方法必须发生在用于CreateXxx().

我不会详细说明采用这种特殊方法的原因。但是,我想用我自己的一组具有公共构造函数的类来封装这些类的创建,这样代码看起来会更好,如下所示:

// No TopClass anymore, see explanation below
MySecondLevelClass secondLevel = new MySecondLevelClass();
MyThirdLevelClass thirdLevel = new MyThirdLevelClass(secondLevel);

我最初的方法是让MyXxx类在构造函数中调用相关CreateXxx()方法并维护对结果的引用。此外,需要对构造函数参数的引用才能DeleteXxx()在完成时调用方法。为此,我正在考虑在内部实现IDisposable和调用。DeleteXxx()Dispose()

使用这种方法,TopClass对于应用程序开发人员来说就变得多余了,因为它的唯一目的是创建和销毁 SecondLevelClass 实例。这现在发生在MySecondLevelClass构造函数的内部。

总而言之,我认为这在技术上是合理的。我遇到的唯一问题是原始类实现了具有很多方法的接口,我仍然希望通过我的MyXxx类公开这些方法。我不期待在我自己的类上重新定义所有这些方法,只是将所有调用转发到对“原始”类实例的封装引用。如果我能做一些像重载点运算符这样的事情会很好。或者,最好告诉编译器对原始类实例的封装引用实际上实现了接口——有点像在 VMT 中添加了一个额外的间接。

当然不支持这些选项,我还没有找到解决所有方法重复的方法。有没有人知道如何以更聪明的方式做到这一点?任何反馈表示赞赏,在此先感谢。

4

2 回答 2

1

也许,您可以使用构建器模式之类的东西来包装它们的构造,而不是包装现有的类。您不会得到 'TopClass o = new TopClass()' 语法,但这样的构造模式很好理解,应该可以提高对代码的理解。

(基本)构建器可能看起来像;

public class OtherAssemblyBuilder
{
    public TopClass Build()
    {
        return TopClass.GetInstance();
    }

    public SecondLevelClass Build()
    {
        TopClass top = TopClass.GetInstance();
        return top.CreateSecondLevelElement();
    }

    public ThirdLevelClass Build()
    {
        TopClass top = TopClass.GetInstance();
        SecondLevelClass secondLevel = top.CreateSecondLevelElement();
        return secondLevel.CreateThirdLevelElement();
    }
}
于 2012-06-27T02:52:03.673 回答
0

你可以做到这一点(据我所知)的唯一方法是执行以下操作 -


public class Concrete : SomeInterface
{
    private Concrete()
    {
        //instantiate other classes here
    }
    public string GetAString()
    {
        return string.Empty;
    }

    public static Concrete GetInstance()
    {
        return new Concrete();
    }

}

public class Wrapper : SomeInterface
{
    public Wrapper()
    {
        this.concrete = Concrete.GetInstance();
    }
    Concrete concrete { get; set; }
    public string GetAString()
    {
        this.concrete.GetAString();
    }
}

public interface SomeInterface
{
    string GetAString();
}

我知道这不是最好的方法,因为您必须手动调用要包装的类上的每个接口成员,但它会实现目标。

也许试试 T4 代码模板?如果您经常遇到这种情况(并且界面发生变化),将来可能会节省您的时间吗?

于 2012-06-27T02:18:22.740 回答