2017-01-19 1 views
1

우리 모두는 인터페이스 클래스와 추상 클래스의 객체를 만들 수 없다는 것을 모두 알고있다. 그러나 왜 추상 클래스에서는 생성자를 가질 수 있지만 인터페이스에서는 생성자를 가질 수 없다. 둘 다의 개체를 만들 수 없습니다. 나는 매우 정직한 대답이 아니라 매우 복잡한 대답을 원합니다.왜 인터페이스는 생성자를 가질 수 없지만 추상 클래스는 생성자를 가짐

답변

2

인터페이스 (예 : .NET 및 Java의 경우)는 모든 구현 클래스에서 특정 인터페이스 (즉 공용 멤버 집합)를 보장하기 위해 지정된 이름으로 만 사용됩니다.

인터페이스는 상태가 있어야하지 않으며 초기 상태와 같은 것을 정의하지도 않습니다. 초기 상태가 없으면 수행 할 인터페이스의 생성자에 대해 합리적인 것이 없습니다.

1

인터페이스는 구현에 의해 충족되어야하는 멤버 서명 집합입니다. 왜 생성자를 정의 할 수 없습니까? 생성자는 구현 세부 사항이므로입니다.

는의가 있다고 가정 해 봅시다 당신이 당신이 후보를 (이것은 단순화) 할 수있는 후보하지만 에 집중하지 않는 사람을 고용 할 때. 후보자가 원하는 기술 배경을 갖고 있습니까? 후보자가 팀웍을 할 수 있습니까? OOP의 관점에서, 당신은 후보자가 당신과 함께 일 해야하는 것을 알고 있습니다. 그러므로 나는 후보자의 어머니와 후보자가 태어난시기에 대해 신경 쓰지 않는다 : 나는 성격과 행동이 나를 받아 들일 수 있는지에 대해 염려한다 오늘. 따라서 당신은 그 문제에 대해 CanWorkOnMyCompany과 같은 인터페이스를 정의 할 것입니다.

반면에 추상 클래스는 일부 멤버가 서명이고 파생 클래스가 구현을 제공해야하는 일반 클래스입니다. 즉, 완전히 구현되지 않았기 때문에 추상 클래스를 인스턴스화 할 수 없습니다.

아마도 추상적 인 클래스는 추상 멤버를 제공 할 수 없다고 주장 할 수 있지만 그 목적이 아닙니다.

0

생성자는 새 인스턴스의 상태를 초기화하기위한 것입니다.

추상 클래스는 상태를 정의 할 수 있으며이를 초기화하는 생성자를 가질 수 있습니다.

인터페이스는 상태를 정의 할 수 없으므로 생성자가 필요하지 않습니다.

+0

글쎄, 내가 생각하기에 전체적인 이유는 아니다. (예 : [내 대답] (http://stackoverflow.com/a/41741609/1430156) 참조), 인터페이스는 * 초기 상태로 선언 한 속성을 초기화 할 수 있기 때문에 비록 논쟁의 여지가 있지만 그들 스스로가 그 상태를 저장하지는 않는다. –

+0

인터페이스의 생성자가 인터페이스로 정의 된 세터 또는 다른 메서드를 호출 할 수 있다는 것을 의미합니까? 생성자로부터 abstract/virtual/overridable 메소드를 호출하는 것은 일반적으로 심각한 코드 냄새로 간주됩니다. 나는 이것이 인터페이스가 생성자를 처음으로 가질 수없는 이유라고 주장 할 것이다. – CKuck

+0

생성자에서 재정의 할 수있는 메서드를 호출하면 해당 메서드가 개체 상태 (예 : 일부 클래스 별 정보 제공)에 의존하지 않을 때, 특히 C#에서와 같이 재정의 할 수없는 정적 멤버가없는 언어의 경우에 그 위치가 있습니다. 나는 인터페이스 생성자 대 클래스 생성자의 호출 순서가 분명하지 않고 문제가 될 수 있다는 것에 동의한다. –

관련 문제