为了解释我的问题,让我向您展示 C# 的示例代码。
interface IConstructorInfoSelector
{
//ConstructorInfo is System.Reflection.ConstructorInfo class.
ConstructorInfo SelectConstructorInfo(Type declaringType);
}
class TestClass
{
private readonly ConstructorInfo _constructorInfo;
public TestClass(IConstructorInfoSelector constructorInfoSelector, Type type)
{
//Let the line to (A)
_constructorInfo = constructorInfoSelector.SelectConstructorInfo(type);
}
public TestClass(ConstructorInfo constructorInfo)
{
_constructorInfo = constructorInfo;
}
public Type GetTypeForConstructor()
{
//Let the line to (B)
return _constructorInfo.DeclaringType;
}
}
在示例中,如果我用ctor(IConstructorInfoSelector, Type) 构造TestClass 并调用GetTypeForConstructor,它将通过(A) 和(B) 行违反LoD(Demeter 法则)。
但是,如果我执行以下代码,该代码是否违反了 LoD?我认为,一方面,它不违反,因为 (C) 行的 testClass 对象在方法内初始化并调用 GetTypeForConstructor 方法,另一方面,它似乎违反了上述情况的原则。综上所述,如果一个返回对象被用来创建另一个对象,这个执行会被认为是违反LoD?
class LoDQuestionForTestClass
{
public void DeosThisVoliateTheLoD()
{
IConstructorInfoSelector concreteSelector = ...;
Type testType = ...;
var selectConstructorInfo = concreteSelector.SelectConstructorInfo(testType);
//Let the line to (C)
var testClass = new TestClass(selectConstructorInfo);
var result = testClass.GetTypeForConstructor();
}
}