파생 클래스의 기본 생성자에서 기본 생성자로 인수를 전달할 수 있습니까?

Zach

추상 기본 클래스 Deck이 있다고 가정합니다.

public abstract class Deck
{
   public List<Card> cards;

   public Deck(string[] values, string[] suits)
   {...}

   ...
}

파생 클래스 EuchreDeck :

public class EuchreDeck : Deck
{
   string[] values = new string[] { "9", "10", "J", "Q", "K", "A" };
   string[] suits = new string[] { "clubs", "spades", "hearts", "diamonds" };

   public EuchreDeck() : base(values, suits) // Error.
   {}

   ...
}

인스턴스화 EuchreDeck하고 두 개의 문자열 배열을 기본 클래스, 즉 var gameDeck = new EuchreDeck();.

현재 "비 정적 필드, 메서드 또는 속성에 대한 개체 참조가 필요합니다."라는 오류가 표시됩니다 EuchreDeck.values.

이것이 가능합니까, 아니면 파생 기본 생성자를 호출하면 항상 기본 기본 생성자가 호출됩니까?

크리스 싱클레어

예, 배열을 만들면 이렇게 할 수 있습니다 static.

public class EuchreDeck : Deck
{
   private static readonly string[] values = new string[] { "9", "10", "J", "Q", "K", "A" };
   private static readonly string[] suits = new string[] { "clubs", "spades", "hearts", "diamonds" };

   public EuchreDeck() : base(values, suits)
   {

   }
}

인스턴스 수준 멤버와 마찬가지로 사용할 수없는 이유는 그렇게하는 것이 합법적이지 않기 때문입니다. 이것은 C # 사양 10.10.1 생성자 이니셜 라이저 에서 온 것입니다.

인스턴스 생성자 이니셜 라이저는 생성중인 인스턴스에 액세스 할 수 없습니다. 따라서 생성자 이니셜 라이저의 인수 식에서이를 참조하는 것은 컴파일 타임 오류입니다. 인수식이 단순 이름을 통해 인스턴스 멤버를 참조하는 것은 컴파일 타임 오류입니다.

배열을로 전환하면 static더 이상 인스턴스를 통해 액세스하지 않고 EuchreDeck 유형별로 액세스 할 수 있습니다 .


즉, 디자인을 약간 조정하는 것이 좋습니다. 생성자가 아닌 공장을 사용하여 이러한 특수 데크를 만들 수 있습니다.

예를 들어 다음과 같이 리팩터링 할 수 있습니다.

Deck카드 세트를 가져 가도록 기지 변경하십시오 .

public abstract class Deck
{
    public List<Card> Cards;
    protected Deck(IEnumerable<Card> cards)
    {
        this.Cards = new List<Card>(cards);
    }
}

그런 다음 다음과 같이 공장 설정을합니다.

public class EuchreDeck : Deck
{
    private EuchreDeck(IEnumerable<Card> cards) : base(cards)
    {

    }

    public class Factory : DeckFactory
    { 
        private static readonly string[] Values = new string[] { "9", "10", "J", "Q", "K", "A" };
        private static readonly string[] Suits = new string[] { "clubs", "spades", "hearts", "diamonds" };

        public static EuchreDeck Create()
        {
            var cards = CreateCards(Values, Suits);
            return new EuchreDeck(cards);
        }
    }
}

인스턴스화 / 사용 :

EuchreDeck.Factory.Create();

공장 사용법을 가지고 놀 수 있습니다. 방금 클래스에 중첩 했으므로 EuchreDeck유효하지 않은 카드 세트로를 만들 수 없습니다 . 귀하의 DeckFactory기지에는 귀하의 변환 방법이 있습니다 (현재 Deck생성자 에있는 것처럼 보임 )

그 외에도에 대한 특정 요구 사항이 있는지 확실하지 않습니다 EuchreDeck. 나는 당신이 그것과 관련된 다른 방법을 가지고 있다고 가정하고 있습니까? 그렇지 않다면, 당신은 아마도 클래스를 모두 버리고 공장 Deck에서 필요한 카드를 만들도록 할 수 있습니다.

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

파생 클래스의 템플릿 인수를 CRTP의 기본으로 전달할 수 있습니까?

분류에서Dev

파생 클래스에서 전용 멤버에 액세스 할 수 없습니다 (생성자가 기본 클래스에 정의되어 있어도)

분류에서Dev

클래스에서 기본 생성자를 전달합니까?

분류에서Dev

파생 클래스가 구현할 기본 클래스의 속성 수를 선택할 수 있습니까?

분류에서Dev

기본 클래스 생성자로 이동하기 전에 unique_ptr에서 원시 포인터를 어떻게 추출 할 수 있습니까?

분류에서Dev

상속 된 인수를 기본 클래스 생성자에 전달한 다음 파생 클래스 생성자에서 작업 수행

분류에서Dev

상속 된 클래스 생성자 인수를 기본 생성자 인수로 전달

분류에서Dev

Android의 Kotlin에서 활동 클래스에 대한 기본 생성자를 작성할 수 없습니다.

분류에서Dev

기본 클래스 개체에 대한 파생 클래스 포인터는 파생 클래스의 메서드를 어떻게 호출 할 수 있습니까?

분류에서Dev

기본 클래스 개체에 대한 파생 클래스 포인터는 파생 클래스의 메서드를 어떻게 호출 할 수 있습니까?

분류에서Dev

모든 기본 인수가있는 명시 적 생성자는 동일한 클래스의 다른 생성자에서 호출 할 수 없습니다.

분류에서Dev

비 생성자 매개 변수 변수를 파생 클래스에서 기본 클래스 생성자로 전달하면 이상한 동작이 발생합니다.

분류에서Dev

비 생성자 매개 변수 변수를 파생 클래스에서 기본 클래스 생성자로 전달하면 이상한 동작이 발생합니다.

분류에서Dev

클래스 본문 외부에서 함수를 정의 할 때 C ++ 파생 생성자- "기본 생성자 없음"

분류에서Dev

C ++ : 새 기본 클래스이지만 파생 클래스의 속성에 액세스 할 수 있습니다.

분류에서Dev

기본 클래스에서 파생 된 클래스의 인스턴스를 함수로 전달

분류에서Dev

파생 클래스는 기본 클래스의 개인 멤버를 다른 기본 클래스의 개인 멤버로 오버로드 할 수 없습니다.

분류에서Dev

생성자에서 this.fieldname을 사용하여 기본 클래스의 필드를 초기화 할 수 있습니까?

분류에서Dev

기본 생성자가 하위 클래스에서 오버로드 될 수 있습니까?

분류에서Dev

기본 클래스에서 파생 클래스 함수를 어떻게 친구 할 수 있습니까?

분류에서Dev

초기화 목록에 설정된 생성자 본문의 변수를 확인할 수 있습니까?

분류에서Dev

파생 클래스를 테스트 할 때 기본 메서드를 어떻게 모의 할 수 있습니까?

분류에서Dev

Javascript에서 "클래스"생성자 인수로 전달되는 변수를 초기화해야합니까?

분류에서Dev

C ++에서 기본이 아닌 생성자로 템플릿 인스턴스를 만들 수 있습니까?

분류에서Dev

C ++ 왜 기본 클래스 / 구조체 생성자는 파생에서 암시 적으로 호출 할 수있는 인수를 두 개 이상 가질 수 없습니까?

분류에서Dev

C #에서 개체가 자체 기본 생성자에서 생성하는 자식 개체의 생성자에 자신에 대한 참조를 전달할 수 있습니까?

분류에서Dev

C ++의 파생 클래스에서 기본 클래스 메서드를 오버로드 할 수 없습니다.

분류에서Dev

C ++ 다형성 : 이중 파생 클래스의 함수를 기본 클래스로 사용할 수 있습니까?

분류에서Dev

CRTP를 사용하여 기본 클래스의 자식 클래스를 생성자에 전달합니까?

Related 관련 기사

  1. 1

    파생 클래스의 템플릿 인수를 CRTP의 기본으로 전달할 수 있습니까?

  2. 2

    파생 클래스에서 전용 멤버에 액세스 할 수 없습니다 (생성자가 기본 클래스에 정의되어 있어도)

  3. 3

    클래스에서 기본 생성자를 전달합니까?

  4. 4

    파생 클래스가 구현할 기본 클래스의 속성 수를 선택할 수 있습니까?

  5. 5

    기본 클래스 생성자로 이동하기 전에 unique_ptr에서 원시 포인터를 어떻게 추출 할 수 있습니까?

  6. 6

    상속 된 인수를 기본 클래스 생성자에 전달한 다음 파생 클래스 생성자에서 작업 수행

  7. 7

    상속 된 클래스 생성자 인수를 기본 생성자 인수로 전달

  8. 8

    Android의 Kotlin에서 활동 클래스에 대한 기본 생성자를 작성할 수 없습니다.

  9. 9

    기본 클래스 개체에 대한 파생 클래스 포인터는 파생 클래스의 메서드를 어떻게 호출 할 수 있습니까?

  10. 10

    기본 클래스 개체에 대한 파생 클래스 포인터는 파생 클래스의 메서드를 어떻게 호출 할 수 있습니까?

  11. 11

    모든 기본 인수가있는 명시 적 생성자는 동일한 클래스의 다른 생성자에서 호출 할 수 없습니다.

  12. 12

    비 생성자 매개 변수 변수를 파생 클래스에서 기본 클래스 생성자로 전달하면 이상한 동작이 발생합니다.

  13. 13

    비 생성자 매개 변수 변수를 파생 클래스에서 기본 클래스 생성자로 전달하면 이상한 동작이 발생합니다.

  14. 14

    클래스 본문 외부에서 함수를 정의 할 때 C ++ 파생 생성자- "기본 생성자 없음"

  15. 15

    C ++ : 새 기본 클래스이지만 파생 클래스의 속성에 액세스 할 수 있습니다.

  16. 16

    기본 클래스에서 파생 된 클래스의 인스턴스를 함수로 전달

  17. 17

    파생 클래스는 기본 클래스의 개인 멤버를 다른 기본 클래스의 개인 멤버로 오버로드 할 수 없습니다.

  18. 18

    생성자에서 this.fieldname을 사용하여 기본 클래스의 필드를 초기화 할 수 있습니까?

  19. 19

    기본 생성자가 하위 클래스에서 오버로드 될 수 있습니까?

  20. 20

    기본 클래스에서 파생 클래스 함수를 어떻게 친구 할 수 있습니까?

  21. 21

    초기화 목록에 설정된 생성자 본문의 변수를 확인할 수 있습니까?

  22. 22

    파생 클래스를 테스트 할 때 기본 메서드를 어떻게 모의 할 수 있습니까?

  23. 23

    Javascript에서 "클래스"생성자 인수로 전달되는 변수를 초기화해야합니까?

  24. 24

    C ++에서 기본이 아닌 생성자로 템플릿 인스턴스를 만들 수 있습니까?

  25. 25

    C ++ 왜 기본 클래스 / 구조체 생성자는 파생에서 암시 적으로 호출 할 수있는 인수를 두 개 이상 가질 수 없습니까?

  26. 26

    C #에서 개체가 자체 기본 생성자에서 생성하는 자식 개체의 생성자에 자신에 대한 참조를 전달할 수 있습니까?

  27. 27

    C ++의 파생 클래스에서 기본 클래스 메서드를 오버로드 할 수 없습니다.

  28. 28

    C ++ 다형성 : 이중 파생 클래스의 함수를 기본 클래스로 사용할 수 있습니까?

  29. 29

    CRTP를 사용하여 기본 클래스의 자식 클래스를 생성자에 전달합니까?

뜨겁다태그

보관