2013-07-05 1 views
0

안녕하세요 저는 C#에서 인터페이스와 추상 클래스를 처음 사용하고 있습니다. 샘플 응용 프로그램을 만들 때 문제가 발생하여 저장 기능에 대한 세부 정보를 저장해야합니다. 응용 프로그램에 공통점은 객체가 다를뿐입니다. void Save(User data);void Save(Admin data) 내 질문에 내가 이렇게하면, 예를 들어 유형 중 하나에 대한 Save 메소드를 호출 할 수 있도록 할 사용자 및 관리자 클래스 dynamicalyC에서 모델 클래스를 동적으로 지정하는 방법

답변

1

사용 Generics

public void Save<T>(T data) where T: class 
{ 
    ... 
} 

을 지정할 수있는 방법입니다

Admin admin = new Admin(); 
User user = new User(); 
dbClass.Save(admin); // T is implicitly inferred by the parameter type 
dbClass.Save(user); 

서명에 대한 제약 즉, where T: class은 클래스 만 매개 변수로 전달할 수 있다고 규정합니다. 그러나 string는 유형을 완벽하게 제어 할 당신이 당신의 클래스가 기본 클래스에서 파생하거나 특정 인터페이스 및 사용을 구현할 수 원하는 경우 기술적으로

dbClass.Save("string") 

를 호출 할 수있는 .NET에서 클래스의 특별한 유형 실제로 제공 그 제약 조건으로 예.

public class Entity 
{ 
    ... 
} 

public class Admin : Entity 
{ 
} 

public class User : Entity 
{ 
} 

그럼 당신은 당신의 제약 조건이 where T : Entity으로 업데이트 할 것, 이것은 당신이 단지 Save 방법으로 개체를 전달할 수 있도록한다.

+0

에서 상속해야합니다

AdminUser이 당신이 호출 할 수 있습니다 의미 예를 들어, '저장 (42)'. 그리고 그것이 그것이 무엇이 원하는지 확실하지 않습니다. – svick

+0

@svick 제약 조건은 클래스 만 저장할 수 있다고 지시합니다. – James

+0

또한 "상속 된"것이 아니라 "추론 된"의미라고 생각합니다. – svick

0

나는 두 가지 옵션을 볼 수

  1. IDbEntity처럼 뭔가를 UserAdmin가 동일한 인터페이스를 구현합니다 (또는 같은 추상 클래스를 상속). 귀하의 방법은 다음과 같다 : 당신의 방법을 저장

    private void Save<T>(T data) 
    { 
        // your implementation here 
    } 
    
    public void Save(User data) 
    { 
        Save<User>(data); 
    } 
    
    public void Save(Admin data) 
    { 
        Save<Admin>(data); 
    } 
    
+0

첫 번째 접근 방식의 문제점은 형식이 손실되어 저장 내용이 손실되는 것입니다. 즉 'User'또는 'Admin'을 저장합니까? 두 번째 접근 방식이 더 좋지만 필요 이상으로 더 많이 작동합니다. – James

+0

@James 알고 싶다면 항상'GetType()'을 사용할 수 있습니다. – svick

0

사용 제네릭 :

public void Save(IDbEntity data) 
  • 데이터 다음이 공공 래퍼, 각 유형에 대한 하나를 저장하는 개인 일반적인 방법을 만들기

    public void Save<T>(T data) where T: MyAbstractClass 
    { 
        // your save method code here 
    } 
    

    리플렉션을 사용하면 절약 할 클래스를 결정할 수 있습니다. 귀하의 클래스 Admin 또는 User 중 하나를 선택하십시오. 같은 추상 클래스

  • +0

    동일한 클래스에서 상속하는 경우 메소드 서명에 해당 클래스를 지정하지 않는 이유는 무엇입니까? – svick

    +0

    당신 말이 맞아요, 제 대답을 편집했는데 제임스의 것이 기본적으로 제 생각과 비슷하지만 더 완벽하다고 생각합니다;) – ToXinE

    관련 문제