2011-10-10 4 views
1

클래스 계층의 일부 구성원에게 특수 구성 코드가 있고 다른 구성원에게 일반 생성자가 필요하면 다음과 같은 기본 객체 팩토리가 있습니다.일반 추상 객체 팩토리에 대한 상속이 제대로 작동하지 않습니다.

여기 내 문제는 TileFactory에 GetInstance 메서드가 없다는 것입니다. TileFactory.GetInstance()를 호출하려고하면 프로그램이 컴파일되지 않습니다. 어떤 충고?

public static class ObjectFactory<K> 
     { 
      public static T GetInstance<T>() where T : K 
      { 
       T obj = (T)Activator.CreateInstance(typeof(T)); 
       return obj; 
      } 
//snip 
      } 

     } 
//snip 
     public static class TileFactory : ObjectFactory<Tile> 
     { 
     } 

답변

4

Why can't I inherit static classes?

표창 :

이것은 의도적으로 설계된 사실이다. 정적 클래스를 상속받을 충분한 이유가없는 것 같습니다. 그것은 당신이 항상 클래스 이름 자체를 통해 접근 할 수있는 public 정적 멤버를가집니다. 정적 인 것들을 상속 한 유일한 이유는 몇 가지 타이핑 문자를 저장하는 것과 같은 나쁜 것들입니다.

정적 멤버를 범위에 직접 가져 오는 메커니즘을 고려해야 할 이유가있을 수 있습니다 (실제로 Orcas 제품 사이클 이후에이를 고려할 것입니다).하지만 정적 클래스 상속은 불가능합니다. 사용하고 정적 클래스에 상주하는 정적 멤버에 대해서만 작동합니다.

(MADS Torgersen, C# 언어 PM) .NET에서

상속은 인스턴스 기반에서 작동는 Channel9에서

다른 의견. 정적 메소드는 인스턴스 레벨이 아닌 유형 레벨에서 정의됩니다. 그래서 오버라이드가 정적 메서드/속성/이벤트에서는 작동하지 않습니다 ...

정적 메서드는 메모리에 한 번만 보관됩니다. 가상 테이블 등은 생성되지 않습니다.

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

(littleguru)

그리고 가치있는 아이디어로

는 littleguru이 문제에 대한 부분 "해결 방법"을 가지고있다.

http://www.dofactory.com/Patterns/PatternSingleton.aspx

2

정적 항목에는 상속이 없습니다. 해결 방법은 싱글 톤을 사용하는 것입니다. 여기에서

관련 문제