Чтобы объяснить мою проблему, позвольте мне показать вам пример кода на 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;
}
}
В примере, если я создам TestClass с помощью ctor(IConstructorInfoSelector, Type) и вызову GetTypeForConstructor, это нарушит LoD (закон принципа Деметры) через линии (A) и (B).
Однако, если я выполню следующий код, не нарушит ли этот код LoD? Я думаю, что, с одной стороны, это не нарушает, потому что объект testClass в строке (C) инициализируется внутри метода и вызывается метод 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();
}
}