2014-03-03 1 views
1

다형성에 관해서는 내 책과 유튜브 비디오 모두 당신이 이것을 할 수 있다는 사실을 빼 먹습니다 : Animal max = new Dog();.다른 클래스 변수를 사용하는 이유는 무엇입니까?

이제는이 시나리오가 적합한 배열을 사용하여 목록을 만드는 예제를 보았습니다. 난 그냥 Dog:Animal 상속을 가정 Animal로 자신의 변수를 설정하여 얻고

Dog max = new Dog();

무엇 max를 작성하지 왜

하지만, 내 앞의 예에서, 내가 추측 할 수?

+0

'Max'는'Animal' 인스턴스가 예상되는 곳이면 어디서든 사용할 수 있습니다. –

답변

1

예를 들어 실제로 이점이 없습니다.

public class Foo 
{ 
    public Animal GetAnimal() 
    { 
     return new Dog(); 
    } 
} 

public class Bar 
{ 
    public void DoSomething() 
    { 
     Foo foo = new Foo(); 
     Animal animal = foo.GetAnimal(); 
    } 
} 

그럼, 왜 그냥 방법 대신 동물의 Dog을 반환 : 다형성의 힘을 강조하는 것이 더 일반적인 시나리오는 다음과 같습니다? 좋은 코딩 방법은 멤버에게 액세스를 제공하기에 충분한 최소 파생 클래스를 반환하도록 알려주기 때문입니다. 훨씬 더 가능성이 시나리오는 대신 인터페이스를 반환하는 것입니다 : 실제 시나리오에서

public class Foo 
{ 
    public IAnimal GetAnimal() 
    { 
     return new Dog(); 
    } 
} 

, 내가 통해 실행 IEnumerable<T>을 반환하지만 정말 배열을 반환하는 방법 중에 가장 자주 케이스. 배열을 반환하지 않는 이유는 무엇입니까? 소비자는 기본 데이터 구조가 아닌 일련의 요소 만 필요로하기 때문입니다.

0

나중에 다른 동물로 변경할 수 있습니다. 예를 들어

)

Animal pet = new Dog(); 

// you do some thing else .. assume your pet is currently dog and your apartment can collect this detail as an animal.. 
// now your dog ran away :D and you have cat as your pet 
// all you have do is just change the variable to point to cat instance 

pet = new Cat(); //ofcourse Cat should inherit Animal 

그래서 자사의 유연성

이제 가정 pets

예)

public Pass issuePass(Animal pet) 
{ 
    return new Pass(pet.gettype(),pet.getowner(),pet.getname()); 
} 
//you dont need to change this method. 
//otherwise you need to create new methods unneccesarily 

public Pass issuePass(Dog pet) 
{ 
    return new Pass(pet.gettype(),pet.getowner(),pet.getname()); 
} 
    public Pass issuePass(Cat pet) 
{ 
    return new Pass(pet.gettype(),pet.getowner(),pet.getname()); 
} 
0

다형성에 일반적인 방법을 많이 할 수있는 아파트 객체 지향 프로그래밍과 관련된 많은 다른 개념을 다루고 있습니다.

그 중 하나는 커플 링입니다. 클래스 (즉, Vet이 매개 변수 (void Treat(Dog dog)Dog을 취하는 방법)이있는 경우,이 두 클래스는 단단히 결합 있습니다 -. DogVet따라

으로 대신 인수로 Animal을 받아 (void Treat(Animal animal)은)는 디커플링의 높은 수준을 달성한다. Vet 지금 Animal에 따라, 구체적인 개념이다 Dog 반대로, 더 추상적 인 개념이다.

을 더 B를 이해하기 위해서는 이것에 대한 enefits은 5 개의 솔리드 원리와 "높은 결합력, 느슨한 결합"을 연구합니다.

그리고 이것은 또 다른 개념, 즉 유연성을 제공합니다. Treat 방법은 이제 훨씬 더 유연 해졌으며 모든 종류의 동물과 함께 사용할 수 있습니다.

0

new Dog()의 인스턴스화를 하드 코딩하면 유용하지 않습니다. 동물 종류에 어떤 종류의 동물이 저장되어 있는지 숨길 때 더 많은 가치를 얻습니다. 이것은 구현을 인터페이스와 완전히 분리합니다.

Animal animal = AnimalFactory.GetAnimal(); 

이제 동물은 개나 고양이 일 수 있습니다. 두 동물 모두 동물이기 때문에 어떤 동물인지 알 필요가 없습니다. 왜냐하면 모든 동물이 상호 작용하는 기본 인터페이스를 지원하기 때문입니다.

이렇게하면 쉽게 프로그램을 테스트 할 수있을뿐만 아니라 단계가 빠진 프로그램없이 구성 요소를 쉽게 교체 할 수 있습니다.


콘크리트 유형을 추상화하지 않더라도 가능한 가장 일반적인 인터페이스로 항상 프로그래밍하는 것이 좋습니다. 개에 특정 기능을 사용하지 않는 경우 개 변수에 저장하는 것이 좋습니다. 이것을 동물에 저장하면 동물의 특징 만 사용된다는 것이 분명해진다. 미래의 유지 보수자는 그것을 볼 수 있으며 개를 다른 동물과 교환하는 것이 안전하다는 것을 알고 있습니다.