2009-07-06 6 views
1

IRepository<TObject>을 상속하는 IRepository 인터페이스가 있습니다. 또한 IRepository<TObject> 구현하는 S QLRepository<TObject>, 상속하는 SqlRepository 클래스가 있습니다. IRepository로 SqlRepository의 인스턴스를 인스턴스화 할 수없는 이유는 무엇입니까? 다음 오류 메시지와 함께, Controller 클래스에 _repository하기 위해 새로운 SqlRepository를 할당 할 때일반 클래스를 일반 인터페이스로 변환 할 수없는 이유는 무엇입니까?

public class MyObject : IObject { 
    ... 
} 

public interface IRepository<TObject> where TObject : IObject, new() { 
    ... 
} 

public interface IRepository : IRepository<MyObject> { } 

public class SqlRepository<TObject> : IRepository<TObject> where TObject : IObject, new() { 
    ... 
} 

public class SqlRepository : SqlRepository<MyObject> { } 

public class Controller { 
    private IRepository _repository; 

    public Controller() { 
     _repository = new SqlRepository(); 
    } 
} 

위의 예는 실패합니다.

Argument '1': cannot convert from 'SqlRepository' to 'IRepository' 

내가 이해하지 못한 상속의 기본 원칙은 무엇입니까?

+0

나는 SqlRespository를 IRepository (공개 클래스 SqlRepository : SqlRepository , IRepository {})를 구현함으로써 문제를 해결했는데, 이는 다소 불필요한 것으로 보이지만 논리를 이해하고 있다고 생각합니다. – kim3er

답변

10

IRepositoryIRepository<MyObject>이므로 다른 방법은 아닙니다.

기본적 :

SqlRepositoryIRepository<MyObject>SqlRepository<MyObject>
이다.
이 작업을하려면 을 IRepository에서 상속 받거나 SqlRepositoryIRepository으로 구현해야합니다.

이 문제는 제네릭 관련 내용이 아닙니다. 가정 :

interface IMovable { } 
interface IDrivable : IMovable { } 
class Ball : IMovable { } 

그것은 그것이 IMovable 동안 BallIDrivable 아니라고 분명하다.

1

SqlRepository은 이 아니라 IRepository을 구현합니다.

0

난 당신이 이런 식으로 선언 할 필요가 있다고 생각 :

private IRepository<MyObject> _repository; 
0

SqlRepository 직접 IRepository에서 상속하지 않습니다, 그것은 IRepository<MyObject>에서 상속됩니다.

SqlRepositoryIRepository에서 직접 상속받습니다.

0

제네릭 형식도 하위 클래스로 만들 수 있습니다.

공용 클래스 SqlObjectRepository : SqlRepository {...}

하지만 난 당신이 즉석에서 그렇게 할 수 있다고 생각하지 않습니다. 객체 정의의 일부 여야합니다.