문제

나는 Ilogin이라는 일반적인 인터페이스로 시작했습니다. 인터페이스는 userID와 비밀번호의 두 가지 속성을 구현해야합니다. 이 인터페이스를 구현하는 로그인 유형 클래스가 많이 있습니다. 내 프로젝트가 성장하고 성장함에 따라 많은 수업이 userID 및 비밀번호 코드를 반복한다는 것을 알았습니다. 이제 기본 로그인 클래스가 필요하다고 결정했습니다.

Ilogin 인터페이스를 구현하고 내 콘크리트 클래스를 모두 추상 클래스에서 상속하고 필요할 때 재정의하는 추상적 인 기본 로그인 클래스를 만드는 것이 적절합니까? 원래 나는 이것에 아무런 문제가 없을 것이라고 생각했다. 그런 다음 나는 일로 진이 불필요하다고 생각하기 시작했을 것입니다.

추상 클래스와 인터페이스를 모두 유지하는 데 이점이 있습니까?

감사!

도움이 되었습니까?

해결책

분명히. 구체적인 예를 생각해 봅시다.

추상 수업이 있다고 말합니다 Animal. 우리는 약간의 서브 클래스를 만듭니다 Cat, Dog, Mosquito, 그리고 Eagle. 우리는 그것을 구현할 수 있습니다 Eat(), Breathe(), Sleep() 추상 클래스의 방법 Animal.

여태까지는 그런대로 잘됐다. 이제 우리가 가고 싶다고 가정 해 봅시다. Fly() 방법을위한 방법 Mosquito 그리고 Eagle 클래스. 이 두 유기체는 실제로 잘 관련되어 있지 않기 때문에 (하나는 새이고, 다른 하나는 곤충입니다) 우리가 추상적 인 계급으로 가질 수있는 두 가지의 공통 조상을 생각해내는 것은 쉽지 않을 것입니다. 이것은 인터페이스에 의해 구현되는 것이 가장 좋습니다 IFly.

그만큼 IFly 인터페이스는 a를 가질 수 있습니다 Fly() 구현 방법. 둘 다 Mosquito 그리고 Eagle 클래스는 모두 추상 클래스의 서브 클래스 일 수 있습니다 Animal 인터페이스를 구현하십시오 IFly 그리고 할 수 있습니다 Eat(), Breathe(), Sleep() 그리고 Fly() 두 클래스 사이에 어떤 유형의 홀수 앙스 트랄 관계가 없는지.

다른 팁

나는 일반적으로 추상 클래스에 대한 코드가 합리적이며 구현 (및 외부 계약 조립/라이브러리에서 생성) 모든 클래스 (추상적 여부)의 인터페이스를 구현하므로 Windows Communication Foundation 또는 더 쉽게 구현할 수 있습니다. 제어의 역전 필요한 경우 (거의 항상 조롱을위한 것). 이것은 나에게 두 번째 본성이되었습니다.

전적으로. 인터페이스는 항상 올바른 방법입니다.이 방법은 무엇이든 구현할 수 있습니다 (이미 부모가있는 것을 포함하여).

추상 클래스는 그것을 만드는 경향이 있으므로 해당 기능의 일부 부분을 다시 구현할 필요가 없습니다. Swing은 약간 사용하고 인터페이스가 있고 5 가지 방법 중 하나를 무시할 수 있도록 기본 구현이 있거나 리스너를 추가하는 데 도움이 될 수 있지만 해당 기본 클래스를 사용할 필요는 없습니다. 원하지 않습니다.

당신의 추상 수업은 인터페이스를 구현하는 클래스는 항상 초록 클래스의 인스턴스를 확인할 수 있습니다. 인터페이스가 필요하지 않습니다. 그러나 아직 작성되지 않은 새로운 클래스와 미래에 호환 되려면 초록 클래스를 확장하지는 않지만 인터페이스를 사용할 수있는 경우 지금 인터페이스를 계속 사용하십시오.

나는 Cfeduke에 동의합니다. 나는 항상 인터페이스로 시작하고 과거에는 인터페이스를 구현하고 기본 기능을 제공하는 추상 클래스를 사용하여 추상 클래스에서 상속되는 클래스 중 코드 재사용을 촉진했습니다. 조롱과 IOC는 일반적으로 인터페이스 의존적이라고 말하며,이 이유만으로도 디자인에 인터페이스를 사용합니다.

초록 클래스에 기능이 있으면 유지하는 것이 좋습니다. 그러나 그것이 추상적 인 방법과 필드가 포함되어 있다면. 나는 둘 다 유지하는 데 사용하지 않는다.

편집하다: 나는 많은 추상 클래스와 함께 레거시 코드에서 작업합니다. 시간이 있다면 인터페이스를 추가하고 (빈 초록을 제거 할 수 있습니다). 인터페이스로 작업하면 가능성이 크게 향상되기 때문입니다. 그리고 그들은 인터페이스를 정확히 정의함으로써 그들의 이름을 존중합니다.

인터페이스는 오브젝트를 수락하기 위해 충족 해야하는 계약을 정의합니다. 초록 클래스는 이행 해야하는 계약을 정의하고 특정 구현 세부 정보를 정의합니다.

이런 식으로 생각하십시오. 누군가가 추상 클래스가 스케치하는 방식과 다른 방식으로 해당 계약을 이행하고 싶어 할 수 있다고 생각한다면 (예 : 다른 백킹 데이터 타입 구현을 사용하여) 인터페이스와 추상 클래스가 모두 있어야합니다. 그것을 구현합니다.

추상 클래스와 인터페이스를 모두 갖는 데 거의 오버 헤드가 없습니다. 해당 접근법에 대한 귀하의 위험은 주로 인터페이스를 구현하는 추상 클래스가 있다는 것을 깨닫지 못하고 필요하지 않은 곳에서 처음부터 전체 구현을 생성한다는 것을 깨닫지 못하는 후에 인터페이스를 가로 질러 오는 것입니다. 나는 당신의 추상 클래스에 인터페이스의 "기본"구현이 있음을 인터페이스 문서에서 지정함으로써 이것을 얻을 수 있다고 말합니다. 일부 코딩 표준은 그 관행에 대해 눈살을 찌푸 릴 수 있지만, 나는 그것에 대한 실제 문제를 보지 못합니다.

나는 항상 당신이 인터페이스를 사용하는 것을 권고합니다. 초록 클래스는 기본 기능을 추가 할 수있는 이점이 있지만 사용자가 단일 상속을 사용해야하는 것은 매우 공격적입니다.

Microsoft 클래스 라이브러리는 기본 클래스를 수정할 수 있으므로 여러 경우의 인터페이스보다 추상 클래스를 선호합니다. 추상 클래스에 메소드를 추가하면 상속을받는 사람이 거의 나쁘지 않습니다. 인터페이스에 메소드를 추가하면 항상 구현기가 나뉩니다. 그러나 이것은 인터페이스를 사용하는 가장 좋은 이유 중 하나입니다. Microsoft가 이미 하나의 상속을 사용했을 수있는 끔찍한 가능성.

그러나 귀하의 특정한 경우 사용중인 설계 패턴을 다시 방문 할 수 있다고 제안합니다. "로그온 유형"클래스를 많이 갖는 것은 드문 일입니다.

인터페이스를 유지하는 이점은 미래의 클래스가 여러 인터페이스를 구현할 수있는 능력이 될 것이라고 생각하는 반면, 클래스는 하나의 추상 클래스에서만 상속 될 수 있습니다.

다른 메소드 세트로 새 인터페이스를 만들어 서브 클래스의 기능을 확장 할 수 있습니다.

인터페이스와 추상 클래스에 동일한 서명이있을 때 구체적으로 묻고 있다고 가정합니다 ...

... (인터페이스의 멤버가 추상 클래스의 구성원과 다른 방식으로 다른 경우 대답은 그렇습니다. 두 가지 모두 필요할 수 있습니다)

... 그러나 회원이 동일하다고 가정하면, 내가 두 가지를 필요로 할 수있는 유일한 이유는 여러 구현 상속을 허용하지 않는 시스템에서 코딩하는 경우 시스템에 다형적으로 유사 해야하는 두 개의 클래스가 있습니다. , 그러나 다른 기본 클래스에서 물려 받아야합니다 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top