다음 시나리오가 있으며 for 루프에 배치 할 디자인 패턴을 파악하려고합니다.
쿼리는 항상 바나나 또는 사과 만 반환합니다. 바나나와 사과를 절대 혼합하지 마십시오. DoStuff를 호출 할 때 쿼리를 제어 할 수 있기 때문에 Bananas 또는 Apples가 반환 될 것인지 미리 알고 있습니다.
나는 바나나의 길이 또는 사과의 직경을 설정하는 DoStuff에 대한 두 번째 매개 변수로 인터페이스를 통과하는 접근 방식을 시도해 왔습니다.
어떻게 이것을 달성 할 수 있는지에 대한 제안이 있습니까? 재사용이 가능하려면 DoStuff가 필요합니다.
public class BaseClass
{
}
public class Apple : BaseClass
{
public int Diameter { get; set; }
}
public class Banana : BaseClass
{
public int Length { get; set; }
}
public void DoStuff(Query query)
{
// The query only ever returns bananas OR Apples. Never both.
var items = repository.GetItems<BaseClass>(query);
foreach (var item in items)
{
// Code to run some arbitrary calculation then set Length if Banana
// Code to run some arbitrary calculation then set Diameter if Apple
}
}
파생 클래스가 동작이나 데이터를 공유하지 않는데 왜 기본 클래스가 있습니까? Liskov Substitution 원리 (LSP)를 살펴 봐야합니다. LSP는 기본적으로 올바른 시스템이 강력한 행동 하위 유형을 준수하며 한 유형이 다른 유형으로 대체 될 때 다형성 시나리오에서 정확성 등을 위반하지 않을 것이라고 말합니다.
당신은 공통점이 전혀없는 두 개의 서브 클래스를 가짐으로써이 원칙을 분명히 위반하고 있습니다. 나는 당신이 이것에 접근하는 다른 방법을 살펴보고 누군가가 당신이 필요로하는 것을 성취하도록 도울 수 있도록 당신이 성취하고자하는 것에 대해 더 자세히 설명 할 것을 제안합니다.
수행하려는 작업에 대해 더 많이 알지 못하는 경우 다음과 같이 제안 할 수 있습니다.
public abstract class BaseClass
{
public abstract void DoSomething();
}
public class Apple : BaseClass
{
public int Diameter { get; set; }
public override void DoSomething()
{
// Do something specific for Apple
}
}
//...
public void DoStuff(Query query)
{
// The query only ever returns bananas OR Apples. Never both.
var items = repository.GetItems<BaseClass>(query);
foreach (var item in items)
{
item.DoSomething();
}
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다