2016-11-18 3 views
1

끔찍한 제목에 사과, 나는 더 좋은 방법으로 생각할 수 없었다.추상베이스의 생성자에서 새 파생 형식 만들기

필자는 기본적으로 추상적 인 기본 클래스 Category을 가지고 있으며 파생 클래스 전체를 상속 받고 있습니다. myCategoryTypeString 항상 파생 클래스 중 하나의 이름과 대신 그 파생 클래스의 새로운 객체를 생성해야합니다

List<Category> catList = new List<Category>(); 
catList.Add(new Category(myCategoryTypeString)); 

은 (아마도에 스위치를 사용 : 그것의 라인을 따라 뭔가를 할 수 있나요 문자열을 사용하여 사용할 클래스를 결정하십시오.)

그래서의 라인을 따라 뭔가가 :

catList.Add(new Category("Engineering")); 

목록에 Engineering : Category 유형의 새 개체를 추가 하시겠습니까?

이것이 가능한 경우 어떻게하면됩니까? 내 추상 클래스는 thusly 히 정의 :

abstract class Category 
{ 
    private string line; 
    private bool ToChallenge; 
    private string[] columns; 
    private int oppLevel; 

    protected Category(string line) 
    { 
     this.line = line; 
     columns = line.Split(','); 
    } 

    public abstract bool IsAnomoly(); 
    public abstract void CategoriseAnomoly(); 
    public abstract void WriteLine(); 

} 
+3

* 가능하지만 코드 접근법은 코드 냄새를 나타냅니다. 늦은 바인딩 접근 방식을 사용 하시겠습니까? 컴파일 타임 검사의 이점을 잃어 버리면 오류가 발생하게됩니다. –

+0

솔직히 말해서 나는 필요하지 않습니다. 무엇보다 더 많은 것이 가능할 지 궁금합니다. –

+0

너무 빨리 닫아서는 안됩니다. 임씨는 "문자열을 클래스 이름으로 변환"과 관련이없는 제네릭 솔루션이 있다는 것을 확신합니다. – Udontknow

답변

5

아니, 당신은 할 수 없어 - 당신은 항상 결코 서브 클래스, Foo의 인스턴스를 만들 것이다, new Foo()를 호출하는 경우.

대신, Category에 정적 팩토리 메소드를 만듭니다

public static Category CreateCategory(string line) 
{ 
    if (line == "Engineering") 
    { 
     return new EngineeringCategory(); 
    } 
    // Whatever you want to do for non-engineering categories 
} 

이 이미 기계 생성 된 출력하지 않는 한 아마 좋은 생각되지 않습니다 실제 유형 이름을 사용하여 주석에 언급 한 바와 같이. 정말로 원한다면 다음과 같이 쓸 수 있습니다 :

public static Category CreateCategory(string typeName) 
{ 
    // Note that the type name would have to be namespace-qualified here 
    Type type = Type.GetType(typeName); 
    return (Category) Activator.CreateInstance(type); 
} 
+0

그 트릭을해야한다, 고마워. –

+0

@JamesHughes : 자세한 내용은 편집을 참조하십시오. –

+0

감사합니다. 형식 이름은 컴퓨터에서 생성 된 스프레드 시트의 입력란에 해당하므로 가장 쉬운 방법 일 수 있으며 일관성이 있어야합니다. –

관련 문제