개발 학습에서 인터페이스에 대해 더 많이 배워야 할 것 같은 시점에 있습니다.
나는 종종 그들에 대해 읽었지만 그것을 이해할 수없는 것처럼 보입니다.
나는 ‘Walk’, ‘Run’, ‘GetLegs’등과 같은 것들을위한 IAnimal 인터페이스를 가진 Animal base class와 같은 예제를 읽었습니다. 여기!”
내가 무엇을 놓치고 있습니까? 내가 이해하기 어려운 개념 인 이유는 무엇입니까? 나는 그것을 이해하는 데 필요한 부분이 없기 때문에 하나의 구체적인 필요성을 깨닫지 못할 수도 있다는 사실에 겁이 난다! 개발자라는 측면에서 뭔가를 놓친 것처럼 느껴집니다! 누구든지 이와 같은 경험이 있고 획기적인 경우이 개념을 이해하는 방법에 대한 몇 가지 팁을 주셔서 감사합니다. 감사합니다.
답변
이 구체적인 문제를 해결합니다.
4 가지 유형의 a, b, c, d가 있습니다. 코드 전체에 다음과 같은 것이 있습니다.
a.Process();
b.Process();
c.Process();
d.Process();
왜 IProcessable을 구현하지 않았습니까?
List<IProcessable> list;
foreach(IProcessable p in list)
p.Process();
예를 들어, 모두 같은 일을하는 50 가지 유형의 클래스를 추가하면 확장 성이 훨씬 향상됩니다.
또 다른 구체적인 문제 :
System.Linq.Enumerable을 살펴본 적이 있습니까? IEnumerable을 구현하는 모든 유형에서 작동하는 수많은 확장 메소드를 정의합니다. IEnumerable을 구현하는 것은 기본적으로 “정렬되지 않은 foreach-type 패턴에서 반복을 지원합니다”라고 말하므로 열거 가능한 유형에 대해 복잡한 동작 (Count, Max, Where, Select 등)을 정의 할 수 있습니다.
답변
나는 지미의 대답을 많이 좋아하지만 그것에 무언가를 추가해야한다고 생각합니다. 모든 일의 핵심은 아이 프로세스의 “수”입니다 수. 인터페이스를 구현하는 개체의 기능 (또는 속성이지만 “C # 속성이 아니라”내재적 품질 “을 의미)을 나타냅니다. IAnimal은 아마도 인터페이스에 대한 좋은 예는 아니지만, IWalkable은 시스템이 걸을 수있는 많은 것들을 가지고 있다면 좋은 인터페이스가 될 수 있습니다. Dog, Cow, Fish, Snake와 같은 Animal에서 파생 된 클래스가있을 수 있습니다. 처음 두 개는 아마도 IWalkable을 구현하고 후자 두 개는 걷지 않으므로 그렇게하지 않습니다. 이제 “개와 소에서 파생 된 다른 슈퍼 클래스 인 WalkingAnimal을 왜 가지고 있지 않습니까?”라고 묻습니다. 대답은 로봇과 같이 걸을 수있는 상속 트리 외부에 무언가가있을 때입니다. 로봇은 IWalkable을 구현하지만 Animal에서 파생되지는 않았을 것입니다. 걸을 수있는 것들의 목록을 원한다면
이제 IWalkable을 IPersistable과 같은 소프트웨어로 대체하면 실제 프로그램에서 볼 수있는 것과 훨씬 유사 해집니다.
답변
동일한 기능의 구현이 다를 경우 인터페이스를 사용하십시오.
공통의 구체적인 구현을 공유해야하는 경우 추상 / 기본 클래스를 사용하십시오.
답변
계약과 같은 인터페이스를 생각하십시오. “이 클래스는 이러한 규칙을 따라야합니다.”라고 말하는 방법입니다.
IAnimal 예제에서는 “IAnimal을 구현하는 클래스에서 Run, Walk 등을 호출 할 수 있어야합니다.”라고 말하는 방법입니다.
이것이 왜 유용한가요? 예를 들어 객체에서 Run and Walk를 호출 할 수 있어야한다는 사실에 의존하는 함수를 만들 수 있습니다. 다음을 가질 수 있습니다.
public void RunThenWalk(Monkey m) {
m.Run();
m.Walk();
}
public void RunThenWalk(Dog d) {
d.Run();
d.Walk();
}
… 걸고 걸을 수있는 모든 물체에 대해 반복하십시오. 그러나 IAnimal 인터페이스를 사용하면 다음과 같이 기능을 한 번 정의 할 수 있습니다.
public void RunThenWalk(IAnimal a) {
a.Run();
a.Walk();
}
인터페이스에 대해 프로그래밍하면 인터페이스의 의도를 구현하기 위해 클래스를 기본적으로 신뢰하게됩니다. 우리의 예에서 생각은 “나는 그들이 달리고 걷는 한, 달리고 걷는 방법에 신경 쓰지 않는다 . 내 RunThenWalk는 그 동의를 충족하는 한 유효 할 것입니다. 클래스.”
이 관련 질문 에 대한 좋은 토론도 있습니다 .
답변
너무 걱정하지 마십시오. 많은 개발자들이 인터페이스를 작성할 필요가 거의 없습니다. .NET 프레임 워크 내에서 사용 가능한 인터페이스를 자주 사용 하지만, 언제라도 작성할 필요가 없다고 생각하면 놀라운 일이 없습니다.
내가 항상 누군가에게주는 예는 Sailboat 클래스와 Viper 클래스가있는 경우입니다. 그들은 Boat 클래스와 Car 클래스를 각각 상속받습니다. 이제 이러한 모든 객체를 반복하고 해당 Drive()
메소드를 호출해야한다고 가정하십시오 . 다음과 같은 코드를 작성할 수는 있지만
if(myObject is Boat)
((Boat)myObject).Drive()
else
if (myObject is Car)
((Car)myObject).Drive()
작성하는 것이 훨씬 간단합니다.
((IDrivable)myObject).Drive()
답변
Jimmy는 여러 유형에 단일 변수를 사용할 수 있기를 원하지만 모든 유형은 인터페이스 선언을 통해 동일한 메소드를 구현합니다. 그런 다음 인터페이스 유형 변수에서 기본 메소드를 호출 할 수 있습니다.
그러나 인터페이스를 사용해야하는 두 번째 이유가 있습니다. 프로젝트 아키텍트가 구현 코더와 다른 사람이거나 여러 구현 코더와 하나의 프로젝트 관리자가있는 경우 담당자는 전체 인터페이스를 작성하고 시스템이 상호 운용되는지 확인한 다음 인터페이스를 구현 클래스로 채울 수 있도록 개발자에게 맡깁니다. 이것은 여러 사람이 호환 가능한 클래스를 작성하고 동시에 수행 할 수있는 가장 좋은 방법입니다.
답변
나는 군대 비유를 좋아한다.
상사는 귀하가 소프트웨어 개발자 , 음악가 또는 변호사 인지 상관하지 않습니다 .
당신은 군인 으로 취급됩니다 .
그것은이다 쉽게 그가 함께 일하고있다 사람의 특정 세부 귀찮게하지 않는 상사에 대한
군인의 추상화로 치료 모두 (… 그들은 사람처럼 행동하지 않을 때이를 처벌).
사람들이 군인처럼 행동하는 능력을 다형성이라고합니다.
인터페이스는 다형성을 달성하는 데 도움이되는 소프트웨어 구성입니다.
필요 단순 귀하의 질문에 대한 답변입니다 달성하기 위해 추상적 인 세부 사항.
어원 적으로 “많은 형태”를 의미하는 다형성 은 기본 클래스의 하위 클래스의 개체를 기본 클래스의 개체 인 것처럼 처리하는 기능입니다. 따라서 기본 클래스는 기본 클래스 자체와 하위 클래스의 여러 형식으로 구성됩니다.
(..) 이렇게하면 코드를보다 쉽게 작성하고 다른 사람들이 쉽게 이해할 수 있습니다. 또한 다른 서브 클래스가 나중에 패밀리 유형에 추가 될 수 있고 새 서브 클래스의 오브젝트도 기존 코드와 함께 작동하므로 코드를 확장 할 수 있습니다.
