왜 정적 클래스를 상속받을 수 없습니까? 대한 상속을 선언 할

실제로 어떤 상태가 필요하지 않은 여러 클래스가 있습니다. 조직의 관점에서, 나는 그것들을 계층 구조에 넣고 싶습니다.

그러나 정적 클래스에 대한 상속을 선언 할 수없는 것 같습니다.

그런 것 :

public static class Base
{
}

public static class Inherited : Base
{
}

작동 안 할 것이다.

왜 언어 디자이너들이 그 가능성을 닫았습니까?



답변

여기 에서 인용 :

이것은 실제로 의도적으로 설계된 것입니다. 정적 클래스를 상속받을 이유가없는 것 같습니다. 클래스 이름 자체를 통해 항상 액세스 할 수있는 공개 정적 멤버가 있습니다. 정적 인 물건을 상속받는 것으로 본 유일한 이유는 입력하는 두 문자를 저장하는 것과 같은 나쁜 이유였습니다.

정적 멤버를 직접 범위로 가져 오는 메커니즘을 고려해야하는 이유가있을 수 있지만 (Orcas 제품주기 이후에이를 실제로 고려할 것임) 정적 클래스 상속은가는 방법이 아닙니다. 사용하는 잘못된 메커니즘이며 작동합니다. 정적 클래스에있는 정적 멤버에만 해당됩니다.

(Mads Torgersen, C # 언어 PM)

channel9의 다른 의견

.NET의 상속은 인스턴스 기반에서만 작동합니다. 정적 메소드는 인스턴스 레벨이 아닌 유형 레벨에서 정의됩니다. 정적 메서드 / 속성 / 이벤트에서는 재정의가 작동하지 않는 이유입니다 …

정적 메소드는 메모리에서 한 번만 보유됩니다. 작성된 가상 테이블 등이 없습니다.

.NET에서 인스턴스 메소드를 호출하면 항상 현재 인스턴스를 제공합니다. 이것은 .NET 런타임에 숨겨져 있지만 발생합니다. 각 인스턴스 메소드에는 첫 번째 인수로 메소드가 실행되는 오브젝트에 대한 포인터 (참조)가 있습니다. 정적 메서드에서는 발생하지 않습니다 (유형 수준에서 정의되었으므로). 컴파일러는 호출 할 메소드를 어떻게 선택해야합니까?

(littleguru)

그리고 귀중한 아이디어로서 littleguru 는이 문제에 대한 부분적인 “해결책”: Singleton 패턴을 가지고 있습니다.


답변

정적 클래스를 상속 할 수없는 주된 이유는 클래스가 추상적이고 봉인되어 있기 때문입니다 (이로 인해 해당 클래스의 인스턴스가 생성되지 않음).

그래서 이거:

static class Foo { }

이 IL로 컴파일합니다.

.class private abstract auto ansi sealed beforefieldinit Foo
  extends [mscorlib]System.Object
 {
 }

답변

이런 식으로 생각하십시오 : 다음과 같이 유형 이름을 통해 정적 멤버에 액세스하십시오.

MyStaticType.MyStaticMember();

해당 클래스에서 상속받은 경우 새 유형 이름을 통해 클래스에 액세스해야합니다.

MyNewType.MyStaticMember();

따라서 새 항목은 코드에서 사용될 때 원본과 관계가 없습니다. 다형성과 같은 것들에 대한 상속 관계를 이용할 수있는 방법은 없습니다.

아마도 당신은 원래 수업에서 일부 항목을 확장하고 싶다고 생각하고 있습니다. 이 경우 원본의 멤버를 완전히 새로운 유형으로 사용하는 것을 막을 수있는 것은 없습니다.

기존 정적 유형에 메소드를 추가하려고 할 수 있습니다. 확장 방법을 통해 이미 그렇게 할 수 있습니다.

아마도 Type런타임에 함수에 정적을 전달 하고 메서드의 기능을 정확히 몰라도 해당 유형의 메서드를 호출 하려고 할 수 있습니다 . 이 경우 인터페이스를 사용할 수 있습니다.

따라서 결국 정적 클래스 상속을 통해 아무것도 얻지 못합니다.


답변

클래스 계층 구조를 사용하여 달성하려는 것은 단순히 네임 스페이스를 통해 달성 할 수 있습니다. 따라서 C #과 같은 네임 스페이스를 지원하는 언어는 정적 클래스의 클래스 계층 구조를 구현할 필요가 없습니다. 클래스를 인스턴스화 할 수 없으므로 네임 스페이스를 사용하여 얻을 수있는 클래스 정의의 계층 구조 만 있으면됩니다.


답변

대신 컴포지션을 사용할 수 있습니다. 그러면 정적 유형에서 클래스 객체에 액세스 할 수 있습니다. 그러나 여전히 인터페이스 또는 추상 클래스를 구현할 수 없습니다


답변

상속 된 클래스 이름을 통해 “상속 된”정적 멤버에 액세스 할 수 있지만 정적 멤버는 실제로 상속되지는 않습니다. 이것이 부분적으로 가상이거나 추상적 일 수없고 재정의 될 수없는 이유입니다. 예제에서 Base.Method ()를 선언 한 경우 컴파일러는 Inherited.Method ()에 대한 호출을 Base.Method ()에 다시 매핑합니다. Base.Method ()를 명시 적으로 호출 할 수도 있습니다. 작은 테스트를 작성하고 리플렉터로 결과를 볼 수 있습니다.

정적 멤버를 상속 할 수없고 정적 클래스에 정적 멤버 포함 할 수 있다면 정적 클래스를 상속하면 어떤 이점이 있습니까?