내 문제는 다음과 같습니다. 분명히 작동하지 않는 홈 프로젝트의 코드 디자인을 만들었습니다. 어쩌면 "코드 냄새"가 어디에서 유래하는지 파악할 수 있습니다.추상 제네릭 형식 변수의 선언
확인을 시작하자 : 내가 아카이브 형식의 주위에 다른 종류의 포장 어떤 클래스를 정의 :
public abstract class Archive { }
public class ZipArchive : Archive { }
public class TarArchive : Archive { }
그 아카이브로 처리하기 위해, 나는 관리자 클래스를 정의했다. 실제로 특정 behaiour을 구현 필요한 동작을 정의 추상적 한
public abstract class ArchiveManager<T> where T : Archive
{
public abstract void OpenArchive(T archive);
}
그리고 구체적인 것들 :
public class ZipArchiveManager : ArchiveManager<ZipArchive>
{
public override void OpenArchive(ZipArchive archive) { /* .. */ }
}
public class TarArchiveManager : ArchiveManager<TarArchive>
{
public override void OpenArchive(TarArchive archive) { /* .. */ }
}
무엇 이제 어떻게하면 컴파일 시간 동안, 내가 아는 해달라고 어떤 종류의 내가 처리 할 아카이브의, 그래서 나는 다음과 같은 시도 : 다음과 같은 오류가 결국
class Program
{
static void Main(string[] args)
{
ArchiveManager<Archive> archiveManager = null;
if (/*some condition*/) {
archiveManager = new ZipArchiveManager();
}
else {
archiveManager = new TarArchiveManager();
}
}
}
:
제가 이해하는 한, generic 인수는 암시 적으로 변환 될 수 없습니다. 이 문제를 해결할 방법이 있습니까? 이 코드/디자인이 "냄새"가 있습니까?
대단히 감사합니다.
만들기, C#을 .NET 4.0의 "동적"키워드를 사용하여 다른 방법 ... 나를 위해 마법처럼
작품을 발견 비 범용 기본 클래스이거나 공변 인터페이스를 사용합니다. – CodesInChaos
또한 'OpenArchive'의 서명이 잘못되었습니다. 스트림을 받아서 'T'를 반환하면 안됩니까? – CodesInChaos