自引用构造函数。这种模式有异味吗?

时间:2016-08-19 12:27:19

标签: c# design-patterns

我正在为高级开发人员进行代码审查,他们已经实现了一个非常好奇的设计模式。

public class A : ABase
{
    private ABase aBase { get; }
    public A(A a)
    {
        aBase = a;
    }
    public A () {}
    //loads of stuff depending on aBase being initialised
}

始终使用A()构造函数,然后将构造的对象传递回A(A)构造函数,如下所示

var a = new A();
//a is not usable at this point.
var b = new A(a);
//b is usable.

我的问题:这是一种合法的设计模式吗?如果没有,初级开发人员如何让高级开发人员对代码库做一些疯狂的事情。

3 个答案:

答案 0 :(得分:1)

我已经知道了。 该课程需要:

  1. 正确使用继承,参考'这个'在内部,并删除私有ABase属性和相关的构造函数。

  2. 不使用继承并使用IoC(在我们的例子中是StructureMap)初始化基类的实例,删除A()构造函数。

  3. 至于接近他,我只是走了过来给了他这两个选项...我猜你得到答案会更容易。

答案 1 :(得分:1)

  

这是一种合法的设计模式吗?

是。这看起来很像Decorator模式,您可以使用组合向类中添加行为,而不会使用太多子类爆炸您的API。模式是否适合您的上下文取决于您未向我们展示的其余代码。

声明var b = new A(a);语句用其他行为来装饰A的现有实例。将其与Strategy模式进行比较,为每个排列/行为组合创建一个新的子类。

  

如果没有,初级开发人员如何接近高级开发人员   对代码库做一些疯狂的事情

此问题超出了StackOverflow的范围。但如果我必须回答这个问题,那么正确的方法就是尽可能多地阅读并以开放的心态接近你的老人。

答案 2 :(得分:0)

这当然很奇怪,因为我不知道它用于什么的更多信息,但通过注入一个实例来关联同一类的两个实例并没有错另一个在它的构造函数中。它似乎没有打破Liskov