잘 basicly C 번호는 다음과 같이 상속을 통해 제외하고, 템플릿 특수화를 허용하지 않습니다
interface IFoo<T> { }
class Bar { }
class FooBar : IFoo<Bar> { }
는 적어도 컴파일 시간 동안이 기능을 지원하지 않습니다. 그러나 당신은 당신이 달성하려고하는 일을 할 RTTI를 사용할 수 있습니다
public bool Save<T>(T entity)
{
// Check if "entity" is of type "SpecificClass"
if (entity is SpecificClass)
{
// Entity can be safely casted to "SpecificClass"
return SaveSpecificClass((SpecificClass)entity);
}
// ... other cases ...
}
is
expression 런타임 유형 검사를 할 매우 편리합니다.
if (entity.GetType() == typeof(SpecificClass))
// ...
편집 : 그것은 다음 코드와 유사한 작동
if (entity is Foo)
return DoSomethingWithFoo((Foo)entity);
else if (entity is Bar)
return DoSomethingWithBar((Bar)entity);
else
throw new NotSupportedException(
String.Format("\"{0}\" is not a supported type for this method.", entity.GetType()));
편집 2 : 다른 답변이 제안으로 알 수없는 유형이 다음과 같은 패턴을 사용하는 것이 매우 일반적이다 메서드를 SpecializedClass
과 함께 사용하면 다형성 작업을 할 때주의가 필요합니다.리포지토리에 인터페이스를 사용하는 경우 (실제로 리포지토리 패턴을 디자인하는 좋은 방법입니다) 오버로드하면 SpecializedClass
의 개체를 전달하는 경우에도 잘못된 메서드가 호출되는 경우가 발생할 수 있습니다.
var repository = new FooRepository();
repository.Save(new Foo());
그러나 당신이 패턴을 사용하는 경우는 예 (인터페이스를 호출하는 경우이 작동하지 않습니다 인터페이스에 : 직접 Foo
의 인스턴스와 FooRepository.Save
를 호출하는 경우
interface IRepository
{
bool Save<T>(T entity)
where T : class;
}
class FooRepository : IRepository
{
bool Save<T>(T entity)
{
}
bool Save(Foo entity)
{
}
}
이 작동 저장소 생성 구현) :
IRepository repository = GetRepository<FooRepository>();
repository.Save(new Foo()); // Attention! Call's FooRepository.Save<Foo>(Foo entity) instead of FooRepository.Save(Foo entity)!
RTTI를 사용하면 Save
방법이 하나만 있어도 괜찮습니다.
C++과 달리 C#은 템플릿 전문화를 허용하지 않습니다. –
이러한 Save() 메소드는 일부 경량 헬퍼 클래스 또는 일부 엔터티 클래스에 있습니까? 나는 상속에 대해 생각하고 있지만 상속이 항상 올바르게 사용되지는 않기 때문에 이것이 올바른지 확인하는 것이 중요합니다. – sll
가능한 중복 [C#의 템플릿 전문화 방법] (http://stackoverflow.com/questions/600978/how -to-do-template-specialization-in-c-sharp) –