추상 클래스 및 다중 인터페이스를 구현하는 C # 함수 매개 변수

Hans D. Ampf

C #에서 다음 구조를 고려하십시오.

interface I1
interface I2

abstract class A
- class A1 : A
  - class A11 : A1, I1
  - class A12 : A1, I2
- class A2 : A
  - class A21 : A2, I1
  - class A22 : A2, I2

이제 생성자에서 인수를받는 클래스 B가 있습니다. 해당 인수는 A에서 파생되고 I2 인터페이스를 구현하는 클래스 여야합니다. 즉, A12 또는 A22 유형의 클래스 일 수 있지만 A11 또는 A21이 아닐 수 있습니다. 해당 매개 변수를 어떻게 정의 할 수 있습니까? 또한 매개 변수를 나중에 B에 속성으로 저장하고 싶습니다 (나중에 사용하기 위해).

A는 많은 가상 메소드를 제공하기 때문에 인터페이스로 재정의 할 수 없습니다. A1과 A2는 B가 아닌 다른 곳에서 사용되는 여러 특정 메서드를 제공하기 때문에 트리와 같은 상속 체계를 건너 뛸 수 없습니다. 그래서 제가 B에서 처리해야 할 것은 A와 I2의 것들입니다.

존 스키트

해당 매개 변수를 어떻게 정의 할 수 있습니까?

기본적으로 할 수 없습니다. 생성자가 아닙니다.

가장 가까운 방법은 B를 반환하는 정적 제네릭 메서드를 만드는 것입니다.

public static B CreateInstance<T>(T item) where T : A, I2

생성자는 제네릭이 될 수 없으므로 생성자에서이 작업을 수행 할 수 없습니다.

그러나 해당 값 저장 해야하는 경우 A또는 유형의 필드를 선택하고 I2필요할 때 캐스트해야합니다.

물론 BEnigmativity의 대답에 따라 일반화 할 수 있지만 다른 의미가있을 수 있습니다. 비 제네릭을 원하면 B잠재적으로 다음 두 가지를 모두 가질 수 있습니다.

public abstract class B
{
    // Common operations which don't depend on the constructor parameter
}

public class B<T> : B where T : A, I2
{
    public B(T item)
    {
    }
}

물론 이것은 꽤 복잡해지기 시작합니다.

양자 택일로, 당신은 할 수 컴파일 시간 검사를 건너 뛰고 바로 실행 시간에 확인 :

public class B
{
    private readonly A item;

    public B(A item)
    {
        if (!(item is I2))
        {
            throw new ArgumentException("...");
        }
        this.item = item;
    }
}

일반적으로 컴파일 타임 안전이 선호 되지만이 경우에 수행해야하는 추가 작업을 수행 할 가치가 없을 수도 있습니다. 유형으로 무엇을하는지에 따라 다릅니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Java 메소드 및 다중 인터페이스를 구현하는 매개 변수 정보

분류에서Dev

포인터를 매개 변수로 사용하는 C ++ 함수 및 swig 인터페이스로 처리

분류에서Dev

유형 검사 매개 변수는 (하위) 클래스이며 인터페이스도 구현합니다.

분류에서Dev

인터페이스를 예상하는 메서드에 람다 함수를 매개 변수로 전달

분류에서Dev

동일한 인터페이스를 구현하는 다른 http 요청 클래스에 다른 매개 변수를 전달하는 방법

분류에서Dev

사용하지 않는 제네릭 매개 변수를 인터페이스에 추가하면이를 구현하는 클래스가 어떻게 중지됩니까?

분류에서Dev

매개 변수 유형의 클래스를 반환하는 메소드로 인터페이스 구현

분류에서Dev

Typescript : 기본 클래스의 추상 생성자 매개 변수 서명을 추상화 및 / 또는 상속

분류에서Dev

순수 가상 클래스 (인터페이스) 및이를 상속하는 개체의 내부 배열 할당

분류에서Dev

OO : 구현하는 새로운 클래스가 추가 매개 변수가 필요합니다

분류에서Dev

다른 매개 변수를 사용하여 매개 변수화 된 인터페이스를 여러 번 구현할 수없는 이유는 무엇입니까?

분류에서Dev

C # 메서드 호출이 인터페이스를 구현하는 클래스를 해당 인터페이스로 캐스팅 할 수 없습니다.

분류에서Dev

클래스를 다른 클래스와 함께 매개 변수로 사용. (C ++)

분류에서Dev

상속 및 기본 매개 변수가있는 케이스 클래스

분류에서Dev

생성중인 클래스를 참조하는 생성자 매개 변수가있는 C # 새 클래스

분류에서Dev

매개 변수 수가 다른 추상 메서드를 구현하는 방법

분류에서Dev

C # : 개인 인터페이스를 구현하는 개체 매개 변수를 사용하여 메서드 테스트

분류에서Dev

기본 인터페이스를 사용하는 위임 매개 변수로 C # 확장 인터페이스 구현

분류에서Dev

부모 인터페이스 매개 변수로 자식 인터페이스를 구현하는 객체 전달

분류에서Dev

추상 클래스 또는 인터페이스 'System.Array'의 인스턴스를 만들 수 없습니다.

분류에서Dev

IMappingAction을 구현하는 클래스에 매개 변수 전달

분류에서Dev

추상 클래스 및 가상 함수

분류에서Dev

Idris의 다중 매개 변수 하위 클래스

분류에서Dev

C ++ 클래스 함수 매개 변수 구문 중 하나가 구조체 인 경우 다른 점은 무엇입니까?

분류에서Dev

템플릿 유형을 함수 매개 변수로 사용하여 추상 템플릿 클래스를 파생하는 방법 (C ++ 11)

분류에서Dev

유형 매개 변수가 다른 속성을 포함하는 동일한 일반 인터페이스를 여러 번 구현합니다.

분류에서Dev

C ++ : 매개 변수 팩을 사용하여 가변 유형 매개 변수로 템플릿 클래스 상속

분류에서Dev

C #에서 하위 인터페이스를 매개 변수로 전달할 수 없습니다.

분류에서Dev

추상 클래스 포인터 매개 변수의 기본값

Related 관련 기사

  1. 1

    Java 메소드 및 다중 인터페이스를 구현하는 매개 변수 정보

  2. 2

    포인터를 매개 변수로 사용하는 C ++ 함수 및 swig 인터페이스로 처리

  3. 3

    유형 검사 매개 변수는 (하위) 클래스이며 인터페이스도 구현합니다.

  4. 4

    인터페이스를 예상하는 메서드에 람다 함수를 매개 변수로 전달

  5. 5

    동일한 인터페이스를 구현하는 다른 http 요청 클래스에 다른 매개 변수를 전달하는 방법

  6. 6

    사용하지 않는 제네릭 매개 변수를 인터페이스에 추가하면이를 구현하는 클래스가 어떻게 중지됩니까?

  7. 7

    매개 변수 유형의 클래스를 반환하는 메소드로 인터페이스 구현

  8. 8

    Typescript : 기본 클래스의 추상 생성자 매개 변수 서명을 추상화 및 / 또는 상속

  9. 9

    순수 가상 클래스 (인터페이스) 및이를 상속하는 개체의 내부 배열 할당

  10. 10

    OO : 구현하는 새로운 클래스가 추가 매개 변수가 필요합니다

  11. 11

    다른 매개 변수를 사용하여 매개 변수화 된 인터페이스를 여러 번 구현할 수없는 이유는 무엇입니까?

  12. 12

    C # 메서드 호출이 인터페이스를 구현하는 클래스를 해당 인터페이스로 캐스팅 할 수 없습니다.

  13. 13

    클래스를 다른 클래스와 함께 매개 변수로 사용. (C ++)

  14. 14

    상속 및 기본 매개 변수가있는 케이스 클래스

  15. 15

    생성중인 클래스를 참조하는 생성자 매개 변수가있는 C # 새 클래스

  16. 16

    매개 변수 수가 다른 추상 메서드를 구현하는 방법

  17. 17

    C # : 개인 인터페이스를 구현하는 개체 매개 변수를 사용하여 메서드 테스트

  18. 18

    기본 인터페이스를 사용하는 위임 매개 변수로 C # 확장 인터페이스 구현

  19. 19

    부모 인터페이스 매개 변수로 자식 인터페이스를 구현하는 객체 전달

  20. 20

    추상 클래스 또는 인터페이스 'System.Array'의 인스턴스를 만들 수 없습니다.

  21. 21

    IMappingAction을 구현하는 클래스에 매개 변수 전달

  22. 22

    추상 클래스 및 가상 함수

  23. 23

    Idris의 다중 매개 변수 하위 클래스

  24. 24

    C ++ 클래스 함수 매개 변수 구문 중 하나가 구조체 인 경우 다른 점은 무엇입니까?

  25. 25

    템플릿 유형을 함수 매개 변수로 사용하여 추상 템플릿 클래스를 파생하는 방법 (C ++ 11)

  26. 26

    유형 매개 변수가 다른 속성을 포함하는 동일한 일반 인터페이스를 여러 번 구현합니다.

  27. 27

    C ++ : 매개 변수 팩을 사용하여 가변 유형 매개 변수로 템플릿 클래스 상속

  28. 28

    C #에서 하위 인터페이스를 매개 변수로 전달할 수 없습니다.

  29. 29

    추상 클래스 포인터 매개 변수의 기본값

뜨겁다태그

보관