저는 Liskov Substitution Principle (LSP)에 대해 읽었으며 올바르게 고수하는 방법에 대해서는 약간 혼란스러워합니다. 특히 인터페이스와 하위 클래스가 사용되는 경우. 나는 기본 클래스가있는 경우C# LSP 생성자 매개 변수 및 Guard 절
예를 들어, :
public abstract class AccountBase
{
private string primaryAccountHolder;
public string PrimaryAccountHolder
{
get { return this.primaryAccountHolder; }
set
{
if (value == null) throw ArgumentNullException("value");
this.primaryAccountHolder = value;
}
}
public string SecondaryAccountHolder { get; set; }
protected AccountBase(string primary)
{
if (primary == null) throw new ArgumentNullException("primary");
this.primaryAccountHolder = primary;
}
}
는 이제 가정 해 봅시다을 나는 기본 클래스에서 상속 두 개의 계정을 가지고있다. SecondaryAccountHolder를 필요로하는 사람. 하위 클래스에 null 가드를 추가하는 것은 LSP를 위반 한 것입니까? 맞습니까? 그렇다면 LSP를 위반하지 않고 하위 클래스 중 하나에 보조 계정 소유자가 필요하고 그렇지 않은 클래스를 디자인하는 방법은 무엇입니까?
화합물은 여러 가지 유형의 계정이있을 수 있다는 사실과 함께 작성자 또는 무언가를 반환하는 공장 또는 공장을 통해 생성되어야한다는 사실에 대한 질문입니다.
그리고 인터페이스에 대해 동일한 질문이 있습니다.
public interface IPrintsSomething
{
void PrintSomething(string text);
}
IPrintsSomething를 구현하는 모든 클래스에 텍스트 널 가드 조항을 추가하는 LSP 위반하지 않을까요 : 나는 인터페이스가 있다면? 불변량을 어떻게 보호합니까? 올바른 단어 맞습니까? : p
AccountBase 예제의 경우 생성자와 어떻게 비슷하게 작동합니까? 그것은 기본 클래스의 생성자가 아닌 경우 SecondaryAccountHolder를 필요로하는 하위 클래스의 생성자를 LSP에 위배합니까? –
생성자가 보호되어 있으므로 클래스의 공개 계약과 관련되지 않습니다. 서브 클래스는 관련된 프로퍼티를 diretly 사용하기 때문에 중복되는 것처럼 보입니다. 생성자를 실제로 원한다면 기본 및 보조 계정을 모두 수용 할 수 있지만 DRY로 유지하면 유효성 검사 논리가 중복되지 않고 대신 속성에 할당됩니다. –
하지만 속성에 직접 할당하면 개체가 유효한 상태임을 보증하지 않습니다. 예를 들어, 기본 클래스에 "RequiresSecondaryAccountHolder"속성을 넣으면 속성을 null로 설정할 수 없으므로 속성이 실제로 설정되었는지 확인할 수 없습니다. 그렇다면 객체를 유효한 상태로 유지하기 위해 파생 클래스에서 생성자를 사용해야 할 필요가 없습니까? 파생 클래스에 대해 다른 생성자를 사용하는 것이 LSP를 위반합니까? –