2017-12-01 20 views
4

추상 클래스는 인스턴스화 할 수없는 특별한 종류의 클래스라는 것을 알고 있습니다. 추상 클래스는 하위 클래스로 분류 (상속)됩니다. 다시 말해, 다른 클래스가 인스턴스를 상속 할 수는 있지만 인스턴스화 할 수는 없습니다. 장점은 모든 하위 클래스에 특정 계층 구조를 적용한다는 것입니다. 간단히 말해서, 그것은 모든 하위 클래스가 동일한 계층 또는 표준을 수행하도록 강제하는 일종의 계약입니다.기본 인터페이스 구현. 추상 클래스와 인터페이스 사이에는 어떤 의미있는 차이가 있습니까?

또한 인터페이스가 클래스가 아니라는 것을 알고 있습니다. 인터페이스라는 단어로 정의되는 개체입니다. 인터페이스에는 구현이 없습니다. 그것은 단지 서명을 가지고 있거나 다른 말로하면 몸이없는 방법의 정의를 가지고 있습니다. Abstract 클래스와 유사점 중 하나 인 모든 하위 클래스에 대한 계층을 정의하는 데 사용되는 계약이거나 특정 메소드 세트와 인수를 정의하는 계약입니다. 클래스 간의 주요 차이점은 클래스가 하나 이상의 인터페이스를 구현할 수 있지만 하나의 추상 클래스에서만 상속받을 수 있다는 것입니다. C#은 다중 상속을 지원하지 않으므로 인터페이스는 다중 상속을 구현하는 데 사용됩니다.

우리는 인터페이스를 만들 때 구현 된 클래스에 의해 재정의되어야하는 구현없이 기본적으로 일련의 메소드를 생성합니다. 장점은 클래스가 상속 계층 구조와 인터페이스의 두 클래스의 일부가되는 방법을 제공한다는 것입니다.

추상 클래스를 만들 때 하나 이상의 완성 된 메서드가있을 수 있지만 하나 이상의 메서드가 완료되지 않고 추상으로 선언 된 기본 클래스를 만듭니다. 추상 클래스의 모든 메소드가 완료되지 않은 경우 인터페이스와 동일합니다. 난 단지 1-2을 가지고 있기 때문에

하지만 하지만 하지만은 우리가 기본 C#에서 인터페이스 방법이있을 것이다 것으로 나타났습니다 8.0

어쩌면 내가 부탁 해요 수년 간의 프로그래밍 경험이 있지만, 추상 클래스와 인터페이스의 주요 차이점은 무엇입니까?

나는 인터페이스에서 상태를 만들 수 없다는 것을 안다. 그것들간에 유일한 차이점이있을 것인가?

+2

정직하게? 그것들은 C#에 mock-multiple-inheritance를 소개하면서 거의 동일해질 것입니다. 이것이 많은 C# 개발자 (자신이 포함)가이 기능에 전적으로 반대하는 주된 이유 중 하나입니다. –

+1

최근에 C# 6은 프로그래밍 언어 디자인의 수익 감소를 설명하기위한 것이었고 C# 7은 수익 감소 시연에서의 수익 감소를 입증하기위한 것이 었습니다. 이것이 C# 8에서 어디로 가는지 볼 수 있습니다. 그것은 일종의 4 차원 스노우 글로브가 될 것입니다. 마이크로 소프트는이 사람들에게 새로운 언어를 찾아야합니다. 이건 끝났어. 모든 기능을 갖추고 있습니다. –

+3

사실 nullable이 아닌 참조 유형에 대한 아이디어를 정말 좋아합니다. –

답변

5

이 아닌 추상 클래스가 상태 및 인터페이스를 가질 수 있다는 명백한 사실 외에 두 가지 차이점이 많습니다. 기본 메소드 또는 가상 확장 메소드은 실제로 Java에서 잠시 사용 가능합니다. 기본 메소드의 기본 드라이브는 인터페이스 변경입니다. 이는 인터페이스의 기존 구현과 소스 또는 바이너리 호환성을 손상시키지 않고 향후 버전의 인터페이스에 메소드를 추가 할 수 있음을 의미합니다.

post 언급 좋은 점 또 다른 커플 :

1

인터페이스를 고유하게 만드는 또 다른 요소는 covariance/contravariance입니다.

솔직하게 말하면, 기본 impl이있는 상황에서는 절대로 알지 못합니다. 인터페이스가 솔루션이었습니다. 나는 그것에 대해 조금 회의적이다.

0

가장 큰 차이점은 인터페이스에없는 추상 클래스의 기본 생성자를 여전히 과부하 할 수 있다는 것입니다.

abstract class LivingEntity 
{ 
    public int Health 
    { 
     get; 
     protected set; 
    } 


    protected LivingEntity(int health) 
    { 
     this.Health = health; 
    } 
} 

class Person : LivingEntity 
{ 
    public Person() : base(100) 
    { } 
} 

class Dog : LivingEntity 
{ 
    public Dog() : base(50) 
    { } 
}