추상 기본 클래스 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] 삭제
몇 마디 만하겠습니다