기본 클래스에서 모두 상속받은 객체의 컬렉션이 있다고 가정 해 보겠습니다. 뭔가 같은 ...다운 캐스트를 방지하기 위해이 디자인을 변경하는 방법은 무엇입니까?
abstract public class Animal
{
}
public class Dog :Animal
{
}
class Monkey : Animal
{
}
지금, 우리는이 동물에게 먹이를해야하지만 그들은 자신을 공급하는 방법을 알 수 없습니다. 그들은 자신을 공급하는 방법을 알 수 없다, 그러나
foreach(Animal a in myAnimals)
{
a.feed();
}
, 그래서 우리는 다음과 같이 수행 할 : 할 수있을 경우, 대답은 간단 것 물론
class Program
{
static void Main(string[] args)
{
List<Animal> myAnimals = new List<Animal>();
myAnimals.Add(new Monkey());
myAnimals.Add(new Dog());
foreach (Animal a in myAnimals)
{
Program.FeedAnimal(a);
}
}
void FeedAnimal(Monkey m) {
Console.WriteLine("Fed a monkey.");
}
void FeedAnimal(Dog d)
{
Console.WriteLine("Fed a dog.");
}
}
이 원 다운 캐스트를 강요하는 것처럼 컴파일하지 마라.
디자인 패턴이나이 문제를 해결하는 데 도움이되는 제네릭을 포함한 다른 솔루션이있는 것처럼 느껴지지만 아직 내 손가락을 넣지 않았습니다.
제안 사항?
(이후 요청 됨)'OfType'은 괜찮지 만, 당신이 품종을 소유 한만큼 많은 OfType을 가져야 만합니다. 결국 방문이됩니다. 여기에 설명 된 사전/위임 기반 방문자 구현은 많은 유효한 접근 방법 중 하나이지만 상속에 대해서는 조금 생각하면됩니다. –
... 즉 Dog에 대한 액션을 등록했지만 Collie 인스턴스를 추가하면 중단됩니다. 또한 람다는 AddFeeder (GiveBananasTo)에 단순화 될 수 있습니다. AddFeeder (ThrowBiscuitsAt). 하지만 합리적인 토론 - = p –
OfType 내가 응답을 나머지 부분에 대한 소개로 안전하게 캡슐화하는 한 다운 캐스트가 얼마나 괜찮은지 보여주기 위해 실제로 언급했습니다. –