2012-05-07 2 views
0

객체 지향 프로그래밍을 배우고 있지만 추상 클래스와 구체적인 클래스에 대해 혼란스러워합니다. 몇 가지 실제 사례가 인정 될 것입니다. 그리고 다른 것을 사용하면서 얻을 수있는 이점은 무엇입니까? 추상적 인 수업과 구체적인 수업을 언제 더 선호합니까? 당신은 당신이 추상 클래스를 사용해야 인스턴스화하지 않아야 객체가있는 경우 내가 Ruby추상 클래스 대 콘크리트 클래스?

+2

이것은 당신에게 몇 가지 일반적인 아이디어를 줄 수 있습니다 .. 아니 루비 ... http://stackoverflow.com/questions/2149207/what-is-the-difference-between-a-concrete-class-and-an- abstract-class – knurdy

답변

3

의 맥락에서 요구하고보다 대답은 모든 언어에 특별한 경우

. 이 클래스를 인스턴스화하려면 구체적인 클래스를 사용해야합니다.

여러 동물 클래스가 필요하다고 상상해보십시오. 그러나 규칙은 개, 고양이 또는 마우스와 같은 특정 동물을 인스턴스화하는 것입니다. 그러나 이제 모든 동물들은 이름과 같은 몇 가지 속성과 방법을 공유합니다. 따라서 코드 중복을 피하기 위해 기본 클래스 Animal에 넣으십시오. 당신은 비록 Animal의 인스턴스를 만들 수 없습니다 :

public abstract class Animal 
{ 
    public string Name { get; set; } 
    public void Sleep() 
    { 
     // sleep 
    } 
} 

public class Cat : Animal 
{ 
    public void Meow() 
    { 
     // meooooow 
    } 
} 

public void DoSomething() 
{ 
    var animal = new Animal(); // illegal operation 
    var cat = new Cat(); // works fine 
} 
+0

글쎄, 언젠가는 코드 강조 표시가 왜 그렇게 잘못되었는지 알 수 있을까요? 내 코드에서 실수를 발견 할 수 없다 : S –

+0

그래서 그 질문은 그처럼 태그가 붙어 있기 때문에 루비라고 생각한다 (나는 믿는다). 이것은 주석의 첫 번째 슬래시를 정규 표현식의 시작으로 해석하고 대문자 단어를 상수로 해석합니다. –

0

추상 클래스는 일반적으로 구체적인 클래스의 기본 클래스입니다. (OO 상속을 통해 파생 됨) 추상 클래스는 일반적으로 구체적인 클래스에 대한 인터페이스를 시행합니다. 그러나 Abstract 클래스는 메서드와 속성을 통해 구체적인 클래스에서 사용하는 공통 기능을 구현할 수도 있습니다.

추상 클래스는 인스턴스화 할 수 없지만 필요한 모든 메소드를 구현한다고 가정 할 때만 구체적인 클래스를 인스턴스화 할 수 있습니다.

+0

"대신에 필요한 모든 메소드를 구현한다고 가정하고 구체적인 클래스 만 인스턴스화 할 수 있습니다." 인터페이스에 맞는 것 같아요. 기본 클래스에서 상속받은 구체적인 클래스는 기본 클래스의 멤버를 구현할 필요가 없습니다. 그것은 상속의 저주 중 하나뿐 아니라 장점 중 하나입니다. –

+0

@ebeeb, 네 말이 맞아, 나는 추상적 인 방법을 구현하는 것을 언급했다. Im은 Ruby에 대해서는 확신하지 않지만 C++ 및 Java와 같은 다른 언어에서는 Abstract 클래스에서 상속 받고 일부만 추상 메서드 (일부는 구현하지 않음)를 구현할 수 있으므로이 특정 주석을 추가 한 것입니다. 그렇다면 모든 추상적 인 메소드를 구현하지 않으면 Concrete 클래스가 될까요? 어쩌면 그것의 명명법 문제. – Brady

+0

인스턴스를 생성 할 수있게되면 곧바로 구체적인 클래스입니다. 구현하지 않더라도 ("구현"은 잘못된 단어입니다. 오른쪽은 "숨기기") 기본 멤버 중 하나입니다. 특정 클래스의 메소드를 "구현"하고 동일한 서명이있는 메소드가 이미 기본 클래스에 존재하면 기본 클래스 구현을 숨 깁니다. 이를 수행하는 일반적인 방법은 기본 클래스의'virtual' 멤버를 사용하는 것입니다.이 클래스는'override' 키워드로 덮어 쓸 수 있습니다. –