2014-04-21 6 views
3

인터페이스를 디자인하려고합니다.이 인터페이스는 제네릭 형식의 ID와이 인터페이스를 구현하는 클래스의 형식을 반환하는 제네릭 메서드를 갖습니다. 예를 들어 :제네릭 메서드로 인터페이스 만들기

내 질문은
public interface IEntity <IDType, MethodReturnType> 
{ 
    IDType ID {get; set;} 
    MethodReturnType Get(); 
} 

public class Model : IEntity<int, Model> 
{ 
    int ID {get; set; } 
    Model Get() { // do something } 
} 

, 내가 모델의 클래스에 이미이기 때문에, 그것을 입력 한 내용을 파악하기 위해 몇 가지 지능 방식이어야 IEntity의 두 번째 유형의 매개 변수로 모델에 넣어 바보 같다 (generic 형식을 사용하면 컴파일 타임 전에 결정해야 함).

인터페이스에서 Get 메서드 정의를 유지하면서 모델 유형을 제거하는 데 도움이되는 다른 솔루션이 있습니까?

+0

ID를 사용하면 "int"를 제거 할 수 있습니까 ??? 그것은 나를 fw 4.0으로 vs 2010 년에 컴파일하는 것을 허용하지 않습니다 ... – Gusman

+0

아니, 방법이 없습니다. 이것이 가능했다면 .. 내가 설계 한 많은 API가 훨씬 더 깨끗하게 보일 것입니다! –

+0

다른 옵션은'MethodReturnType'을'Object'로 대체하는 것입니다. – Dialecticus

답변

1

이 컨텍스트에는 클래스와 인터페이스를 설계하는 두 가지 일반적인 방법이 있습니다. 답을 좀 더 일반적으로 만들려고 정확한 예제에서 약간 벗어나겠습니다.

선택할 수있는 옵션은 실제로 클래스와 인터페이스를 사용하는 방법에 따라 다릅니다. 인터페이스 멤버는 정확한 유형의 지식을 가질 수 있도록

옵션 1

, 당신의 인터페이스는 일반적인합니다.

public interface IEntity<TDescription> 
{ 
    TDescription Get(); 
} 

public class MyModel : IEntity<MyDescription> 
{ 
    MyDescription Get() { ... } 
} 

public class MyDescription { ... } 

당신이 당신의 인터페이스를 사용할 때 사용시 TDescription을 알 필요가 IEntity<TDescription> 것을 의미한다. 이점은 더 많은 컴파일 타임 유형 검사를 얻는 것입니다.

이이 인터페이스는 일반적인하고 대신 인터페이스 멤버뿐만 아니라 인터페이스를 사용하지 마십시오 옵션.

public interface IEntity 
{ 
    IDescription Get(); 
} 

public interface IDescription { ... } 

public class MyModel : IEntity 
{ 
    MyDescription Get() { ... } 
    IDescription IEntity.Get() { return this.Get(); } 
} 

public class MyDescription : IDescription { ... } 

이 방법은 유연성이 뛰어나지 만 컴파일 시간을 줄이는 것도 의미합니다.

+0

Get() 메서드를 사용하면 데이터베이스에서 개체를 검색하는 데 사용되므로 클래스 (Model)의 형식을 반환해야합니다. 이 MyDescription \ IDescription의 컨텍스트는 무엇입니까? – jamesdeath123

+0

@ jamesdeath "답변을 좀 더 일반적으로 만들려고 정확한 예제에서 약간 벗어나겠습니다." 인터페이스에서 제네릭이나 보조 인터페이스를 사용할지 여부와 같은 일반적인 문제와 디자인 결정을 변경하는 특정 시나리오는 없습니다. –

1

this.GetType()을 사용하여 상속 된 클래스 유형을 결정할 수 있지만 그렇게하면 일반 함수/매개 변수/etc를 만들 수 없습니다.

당신이 어떤 식 으로든 그 유형을 사용하지 않는 한 당신은 대답 할 수 없습니다. 당신은 여전히 ​​클래스의 기본 유형을 얻고 그것을 사용할 수는 있지만 반환 유형/매개 변수 유형/기타).

관련 문제