제네릭 추상 클래스에 대한 몇 가지 문제가 있는데 하위 클래스이며이를 해결하는 방법을 모르겠습니다.일반 추상 클래스 및 제네릭 메서드
public class CommonPoco {
private int line;
public int Line {
get { return line; }
set { line = value; }
}
private string error;
public string Error {
get { return error; }
set { error = value; }
}
}
지금 나는 또한이 같은 로더의 많은 다른 서브 클래스가 :
public class CountryLoader: Loader<Country> {
public override List<Country> LoadFromFile(StreamReader input,
out List<Country> result, bool trackProgress, IFormatProvider format) {
//Method implementation
}
public override Country UploadToDb(List<Country> data) {
//Method implementation
}
그리고 나는 또한 가지고이 내 CommonPoco입니다
public abstract class Loader<T> where T: CommonPoco {
public virtual List<T> LoadFromFile(StreamReader input, out List<T> result, bool trackProgress) {
return LoadFromFile(input, out result, trackProgress, CultureInfo.CurrentCulture);
}
public abstract List<T> LoadFromFile(StreamReader input, out List<T> result, bool trackProgress, IFormatProvider format);
public abstract T UploadToDb(List<T> data);
}
: 나는 다음과 같은 추상 클래스를 Country 클래스를 포함한 CommonPoco의 많은 서브 클래스. 여태까지는 그런대로 잘됐다. 이제 문제를 해결하려면 일반,?, 메서드를 구현하고 싶습니다. 이 메서드는 일부 매개 변수를 기반으로 작업에 대해 올바른 로더를 사용합니다. 이 같은 아마 뭔가 :
void LoadModule<T>(Module module) where T: CommonPoco {
Loader<T> loader;
switch (module) {
case Module.Country:
loader = new CountryLoader();
break;
}
}
이 작동하지 않고 컴파일러는 CountryLoader에서 로더로 변환 수 없다는 불평. 각 모듈을로드하는 메소드를 작성해야하며 Loader 클래스의 초기화를 제외하고는 정확히 동일한 코드입니다. 중복 코드가 정말 싫어. 어떻게 이걸 얻을 수 있니?
.NET Framework 4.0을 사용하는 것을 잊었습니다. 필요한 경우 무엇이든지 변경할 수 있습니다. 필요한 경우 추상 수업조차도 변경할 수 있습니다. 감사. 추상 클래스 대신 인터페이스를 사용하면이 작업을 수행 할 수 있는지 궁금합니다.
Castle Windsor와 같은 IoC 컨테이너를 사용할 수도 있고 반사 효과 만 사용할 수도 있습니다. 하지만 왜 'List'매개 변수가'List '반환 값을 가진 메소드에 있습니까? 그것은 매우 이상하게 보입니다. –
phoog
'Loader'('CountryLoader')은'Loader '이 아닙니다. 그래서'Country'는'CommonPoco'에서 상속받을 수 있지만 (위의 OP에서 그 관계가 언급되지는 않았지만) 일반적인 클래스는 상속이 아닙니다. –
Tejs
또한 이것은 일반적으로 사람들이 유형이 아닌 특정 데이터 (이 경우'module')를 전달하고 강력하게 형식화 된 결과를 기대할 때 발생합니다. 결과 유형을 판별 할 수없는 경우 해당 데이터에 액세스하는 방}을 다시 생각해 야 할 수도 있습니다. – Tejs