같은 기본 클래스에서 모두 파생 된 개체 컬렉션이있는 경우가 있습니다. 컬렉션을 반복하고 각 항목의 유형을 확인하면 해당 객체가 파생 된 유형인지 알 수 있으며 그에 따라 적절하게 처리 할 수 있습니다. 제가 이미 알고있는 것은 파생 된 타입에 대한 체크를 수행하는 쉬운 방법이 있다면 제가 이미하고있는 것입니다. 코드 반복은 일반적으로 필요하지 않으므로, 현재의 방법론은 나에게 조금 떨어져 보인다.기본 클래스 유형의 파생 클래스 유형마다 캐스트를 시도하지 않고도 업 캐스팅 된 객체를 다시 다운 캐스팅 할 수 있습니까?
class A {}
class B : A {}
class C : A {}
class D : C {}
class Foo
{
public List<A> Collection { get; set; }
}
class Bar
{
void Iterate()
{
Foo f = new Foo();
foreach(A item in f.Collection)
{
DoSomething(a);
}
}
void DoSomething(A a)
{
...
B b = a as B;
if(b != null)
{
DoSomething(b);
return;
}
C c = a as C;
if(c != null)
{
DoSomething(c);
return;
}
D d = a as D;
if(d != null)
{
DoSomething(d);
return;
}
};
void DoSomething(B a){};
void DoSomething(C a){};
void DoSomething(D a){};
}
나는 모든 웹 서비스가 동일한 결과 유형이 있어야합니다 웹 서비스와 함께 일하고 있습니다.
class WebServiceResult
{
public bool Success { get; set; }
public List<Message> Messages { get; set; }
}
class Message
{
public MessageType Severity { get; set; } // Info, Warning, Error
public string Value { get; set; } //
}
class InvalidAuthorization: Message
{
// Severity = MessageType.Error
// Value = "Incorrect username." or "Incorrect password", etc.
}
class InvalidParameter: Message
{
// ...
}
class ParameterRequired: InvalidParameter
{
// Severity = MessageType.Error
// Value = "Parameter required.", etc.
public string ParameterName { get; set; } //
}
class CreatePerson: Message
{
// Severity = MessageType.Info
// Value = null
public int PersonIdentifier { get; set; } // The id of the newly created person
}
목표는 우리가 원하는만큼 많은 종류의 메시지를 클라이언트에 반환 할 수 있다는 것입니다. 웹 서비스 호출 당 하나의 메시지를받는 대신, 피 호출자는 단일 여행에서 모든 실수/성공을 알 수 있고 메시지에서 특정 정보를 파싱하는 문자열을 제거 할 수 있습니다.
원래 제네릭을 사용하는 것이지만 웹 서비스가 다양한 메시지 유형을 가질 수 있으므로 컬렉션이 기본 메시지 클래스를 사용하도록 확장되었습니다.
실제로 달성하려는 것은 무엇입니까? 내가 물어 보는 이유는 당신이 그것에 관해가는 길은 반 패턴과 같은 냄새가 난다는 것입니다. 이런 식으로 많이 던지면 좋지 않은 신호입니다. Liskov Substitution Principle (http://en.wikipedia.org/wiki/Liskov_substitution_principle) –
전체적인 목표를 설명하기 위해 질문을 편집했습니다. – JWilliams