2010-07-05 4 views
16

코드 수량 대신 코드 품질에 중점을 둔 작은 코딩 프로젝트를 자체적으로 시작하기로 결정했으며 추상 클래스 사용에 대한 질문이 있습니다.추상 클래스 대 정규 클래스 사용의 이점

이제 추상 클래스와 인터페이스의 차이점을 알았는데 가장 큰 인터페이스는 인터페이스와 추상 클래스를 사용하여 클래스에서 구현해야하는 메서드 만 정의 할 수있게 해 주므로 두 메서드를 모두 정의 할 수 있습니다. 원하는 경우 기본 메서드 구현과 함께 멤버를 만들 수 있습니다. 제 질문은 추상 클래스와 정상 클래스를 사용하는 것의 주된 장점은 무엇입니까? 내가 생각할 수있는 유일한 차이점은 추상 클래스의 인스턴스를 만들 수 없다는 것입니다. 둘 사이에 다른 점이 있습니까?

+7

downvoters는 당신이 대답을 downvote 왜 언급하시기 바랍니다! – apollodude217

답변

14

엄밀히 말하면 디자인 관점에서 보면 사물을 단순화하는 것이 가장 좋습니다. 사물을 단순화하는 가장 좋은 방법은 간단한 비유를 사용하는 것입니다. 조류의 유추를 사용합시다 ...

인터페이스 : 정의해야 할 특정 기능을 시행하고자 할 때 사용하십시오. 예 : IBird는 ScreamLikeABird and Fly (인터페이스 기능)에 대한 계약을 맺고 있습니다. 하지만 좀 더 구체적으로 할 수 있고 실행 계약을 맺은 IOstrich를 가질 수 있습니다. Attack 계약을 맺은 IHawk가있을 수도 있습니다.

초록 : 기본 기능을 적용하고 기본 속성을 사용하려는 경우 사용합니다. 예 : 새는 LayEgg라는 함수뿐만 아니라 Age, Species, NumberOfChicks ... 등의 속성을 가진 새의 기본 클래스가 될 수 있습니다. 이러한 것들은 모든 새들이 알을 낳기 때문에 새의 행동을 바꾸지 않아야합니다. 그러나 모든 새들이 비명을 지르거나 같은 방식으로 날 때 (일부는 심지어 날지 않아도) 같은 소리를내는 것은 아닙니다 .... 등 ... 따라서 그들은 인터페이스를 통해 구현되어야합니다.

+26

-1은 혼동스럽고 비현실적인 동물 유추를 나타냅니다. –

+6

실용적인 동물 유추는 "인터페이스 대 추상적 인"의 혼란을 완화하는 데 사용되었습니다. 안녕, 안녕하세요 세계의 모든 번역은 얼마나 비실용적입니까? 실용성은 그것과 아무 관련이 없습니다. 게다가, 나는이 유추가 많은 응용 프로그램 및/또는 게임에서 극히 실용적인 것을 볼 수 있습니다. – AlvinfromDiaspar

+0

@AlvinfromDiaspar +1 글쎄, 세상에서 가장 단순한 설명이라고 생각한다. – Rohit

-2

추상 클래스는 OOP 기반 "라이브러리"에 메서드를 저장하는 데 사용할 수 있습니다. 클래스를 인스턴스화 할 필요가 없기 때문에 클래스에 공통된 정적 메서드를 추상 클래스 내에 유지하는 것이 일반적입니다.

+0

"Java에서는 클래스를 final로 선언 할 수도 있으므로 확장 할 수 없습니다." 아니, 할 수 없어. '추상적'+'최종'은 허용되지 않습니다. 클래스가 정적 유틸리티 메소드만을위한 클래스 인 경우에는 비공개 (사용되지 않는) 생성자가있는 최종 클래스 여야합니다. –

+0

@Matthew Flaschen : 찍은 포인트. 해명 해줘서 고마워. – amphetamachine

+1

정적 메서드는 추상 클래스의 주된 이유가 아닙니다. – apollodude217

8

추상 클래스의 인스턴스를 만들 수 없다는 것 외에도 일부 언어는 추상 클래스에서 추상 메소드를 지원할 수 있습니다. 인터페이스와 마찬가지로 추상 클래스에서 상속 한 클래스가 추상 메소드를 구현해야합니다.

제 생각에 추상 클래스의 주요 이점은 동일한 유형의 클래스간에 공유되어야하는 코드가있는 경우입니다. 일반적으로이 인터페이스를 사용할 수 있지만 때로는 이러한 클래스의 기능이 겹쳐서 코드 중복이 발생할 수 있습니다. 이 경우 추상 클래스를 사용하여 코드를 삽입 할 수 있습니다.

+3

+1 정확하고 짧은 답변. – apollodude217

+0

클래스가 추상 멤버를 가지지 않고 생성 된 인스턴스가 잘 정의 된 동작을하더라도 인스턴스를 서로 구별 할 수있는 것이 포함되어 있지 않으면 클래스를 추상으로 정의하는 것이 현명 할 수 있습니다. 예를 들어, 'ArrayBackedImmutableList ','ComputedImmutableList ','LazyImmutableList '등등을위한 하위 클래스를 가진'ImmutableList '기본 클래스를 정의 할 수 있습니다. 기본 클래스 인스턴스는 0 아이템 이 같은 목적으로 구체적인'EmptyImmutableList '클래스를 정의하는 것이 더 깔끔할 것이다. – supercat

-1

이 당신을 도울 수는 차량, 즉 자동차, 자전거, 자전거 등의 모든 종류를 사용할 수 있습니다 여행자 ...
을 고려할 수 있습니다하지만 우리는 하나

을 가질 수 있도록 모든 차량은 다른 속도 제한과 같은 방식으로 이동
abstract class Avehicle  
{ 
     string fuel; 
     public void move() 
{ 
sysout("moving"); 
} 
} 

하지만 모든 차량 파괴 시스템은

interface Ivehicle  
{ 

     public void breakorstop(); 
} 
class Traveler  
{ 
    Ivehicle v; 
//Settrers and getters 
public drive() 
{ 
v.move(); 
} 
public break() 
{ 
v.breakorstop(); 
} 
} 

그래서 결국 자동차 또는 사이클이나 자전거 클래스가 Avehicle을 확장 할 수 있습니다 및 Vehicl을 구현할 수 있습니다 다르다 e 인터페이스

6

OO 세계에서 추상적 인 클래스는 어떤 설계를 시행하는 데 사용되었습니다. & 구현 제약 조건. 아무것도 더. 어쨌든 추상 클래스를 사용할 필요는 없습니다. 그러나 이러한 제약 조건을 더 잘 적용하는 경우가있을 수 있습니다. 그래서 그들은 무엇입니까?그것을 oo-counterparts를 비교하여 보자.

추상 클래스 대 인터페이스

아시다시피,이 상속의 기본 개념이 있습니다.

기본적으로 인터페이스는 기본 서비스를 상속받을 의사가 있다는 것을 선언하기 위해 사용됩니다. 구현이 없습니다 &에는 기능이 없습니다. 그런 의미에서 인터페이스는 추상적입니다. 이것이 구현 제약 조건보다 설계 제약 조건이 더 큰 이유입니다. 스피커의 헤드폰 잭을 생각해보십시오. 각 헤드폰은 잭 인터페이스 (start, stop, listen, turnDown, turnUp 메소드 포함)를 구현해야합니다. 스피커가 제공하고 그에 따라 구현하는 기능을 상속하려면 각 헤드폰이이 인터페이스를 재정의해야합니다. 한편, 클래스는 구현 된 메소드를 포함 할 수 있습니다. 이것이 기본 차이점이며, 그런 의미에서 인터페이스 이상의 재사용을 활용할 수 있습니다. 또한, 그들은 개인적이고 보호 된 & 비 정적 필드를 포함 할 수 있습니다. 추상 메소드 (구현이없는 메소드)로 하위 클래스가 필수 기능을 일부 구현하도록 할 수 있습니다. 추상 클래스는 인터페이스보다 민첩합니다.

물론 인터페이스 수를 구현할 수있는 자바에서 하나의 클래스 만 확장 할 수 있습니다.

추상 클래스 대 정규 수업

왜 다음 정규 수업을 사용하지. 추상 클래스를 사용하면 어떤 이점이 있습니까? 이것은 매우 간단합니다. 추상 클래스를 사용하면 형제가 핵심 기능을 구현하게됩니다. 개발자는 필수 기능을 구현해야한다는 것을 기억할 필요가 없습니다. 이것은 추상 클래스가 정규 클래스에 대한 디자인 제약을 부과하는 곳입니다. 또한 클래스를 추상화하여 우연히 생성되는 클래스 (불완전한 클래스)를 피할 수 있습니다.

+0

** ** 형제 님 **은 추상을 클래스를 부모로 상속한다는 점을 감안할 때 아이를 의미합니다. 권리 ? –

+0

@ DaniyalNasir 예. – zgulser

0

추상 클래스 vs 일반 클래스. 추상 클래스는 일반적으로 일반화에 대한 아이디어를지지하고, 추상 메소드가 서브링 클래스에서 추상 메소드를 구현하는 것을 기술해야하기 때문에 다중 년간 프로젝트를 설계함으로써 프로그래머가 뇌의 징계를 거의 지키지 않고 기여할 수 있지만, 이 기능은 개발자가 Zeitnot을 가지고있을 때 단시간 프로젝트의 단점입니다.

0

클래스를 추상으로 선언하는 유일한 이유는 인스턴스화 할 수 없기 때문입니다. 여러 클래스간에 공유되는 공통 기능을 갖지만 공통 기능이 개체를 나타내지 않거나 불완전한 개체를 나타내는 경우가 있습니다. 이 경우 공용 함수를 추상화하여 인스턴스화 할 수 없도록 정의합니다.

+0

무엇이 잘못 되었나요? –

1

제 생각에는 추상 클래스는 실제 프로젝트에서 책과 같이 더 많이 사용합니다. 프로젝트 관리자는 메소드 선언을 제공하기 만하고 매니저가 제공하는 핵심 구문을 수정하지 않고 메소드에 대한 코드를 작성해야한다. 그래서 그것은 추상적 인 클래스가 어떻게 완전하게 사용되는지입니다. 간단한 클래스 메쏘드 정의에서, 같은 시간에 선언되고 코딩되었지만 추상 클래스에는 없다. 예 : -

abstract class Test 
{ 
    abstract void show();//method provided 
} 
class Child extends Test 
{ 
    void show()//coding 
    { 
     System.out.println("saurav"); 
    } 
} 
class main 
{ 
    public static void main(String[] args) 
    { 
    Test c = new Child(); 
    c.show(); 
    } 
}