2017-11-01 1 views
0

최근에 제네릭 인터페이스 문제가 발생했습니다. 인터페이스 목록을 만들고 싶었지만 일반적인 인터페이스에서는 그렇게 쉽지 않습니다. 나는 이런 식으로 목록을 만들 수 있습니다 : new List<IModelCreator<IDataCollection>>();하지만 나는 추한 것처럼 보입니다.인터페이스 상속 인터페이스가 있지만 오버라이드 메서드가 없습니다

이제 인터페이스가 2 개 있습니다. 하나는 일반과 하나는없는 것입니다. 여기에 내가 지금 사용하는 인터페이스는 다음과 같습니다

public interface IModelCreator 
{ 
    IDataCollection GetModelFromPath(string path); 
} 

public interface IModelCreator<T>: IModelCreator where T : IDataCollection 
{ 
    new T GetModelFromPath(string path); 
} 

IModelCreator가 모델로 파일 경로를 전환하고 T 그것이로 바뀌 얻을 것이다 모델 인 클래스입니다. 그래서 지금 수업 중에 이것을 사용하면 다음과 같이됩니다 :

public abstract T GetModelFromPath(string path); 

IDataCollection IModelCreator.GetModelFromPath(string path) 
{ 
    return GetModelFromPath(path); 
} 

(나는 그것을 추상적으로 만들었습니다). 하지만 거기에 2 대신에 1 개의 방법을 만드는 방법은 없지만 동일한 기능을 가지고 있습니까?

나는 또한 비 제네릭 인터페이스로 시도했다. 나는 다음과 같은 추상 클래스가 있습니다

public abstract class DocumentConverterCreatorBase<T>: IModelCreator where T: IDataCollection 

을하지만 내 일반 T 등의 반환 형식을 사용할 수 없습니다. 그리고 나는 이유를 모른다.

+0

힌트 : 당신은 좋은 디자인 회원 전에'new'을 넣어하지 않아도됩니다. 그것은 반창고입니다. –

+0

@HenkHolterman 그것은 내가 행복해했던 유일한 것입니다. 내 게시물에서 언급 한 List 변형을 생각해 낼 수 있습니다. 나는 그저 올바른 방향으로 나를 도울 수있는 몇 가지 해답을 얻을 수 있기를 바랍니다. – patrick

답변

0

나는 당신이 할 수 있다고 생각 :

public class ModelList : List<IModelCreator<IDataCollection>> { } 

//And then use it like this 
ModelList l = new ModelList(); 
+0

그건 정말 깨끗한 방법입니다. 고마워, 고마워! 빈 클래스를 갖는 것이 이상하지 않습니까? 아니면 추상적으로 확장되기 때문에 우리는 함께 살 수 있습니까? – patrick

+0

전혀 그렇게 생각하지 않습니다. 이제는 메서드, 도우미 또는 목록을 조작하는 데 도움이되는 다른 요소를 추가 할 수 있습니다. 또한 "List >"을 입력 할 때 기억하기가 훨씬 쉽습니다. – acivic2nv

+0

새로운 형식을 만들지 않고 대신 별칭을 사용하는 대체 방법은 다음과 같습니다.'ModelList = List >; –

관련 문제