2017-01-14 3 views
1

그래서 모든 항목이 다른 클래스를 상속하는 인벤토리 시스템을 C#으로 만듭니다. 현재 저는 몇 가지 테스트 클래스를 만들고 있는데, 그 중 하나는 Fish입니다. Fish는 Items (최상위 클래스)에서 상속 한 소모품에서 상속합니다. 참고 : 소모품은 기본적으로 스택 가능 항목입니다. 단지 1상속에서 this() 및 base() 사용

그리고 하나 개의 인수, 양 소요 하나에 양을 설정

public Consumable() : base() { 
    quantity = 1; 
} 

:

나는 인수가없는 것을, 소모품 클래스에서 하나를이 기본 생성자를 만들려면 :

public Consumable(int Quantity) : this() { 
    if (quantity <= maxStack) 
     quantity = Quantity; 
    else 
     quantity = maxStack; 
} 

생성시 수량을 설정하십시오. 지금 나는 위의 코드에서 this()를 사용하여 자식이 자신의 기본 argumentless 생성자를 사용하도록 강요한다고 생각했지만 그럴 것 같지 않습니다.

public Fish() : base() { 
    name = "fish"; 
    ID = 1; 
    variant = 0; 
    maxStack = 20; 
    desc = "A Fish of some kind"; 
    rarity = ItemRarity.Common; 
} 

public Fish(int QTY) : base(QTY) { } 

는 내가 일이 원하는 것은 내가 그 다음 소모품을 전화 기본 사항을 설정하는 물고기()를 호출 할, 물고기 (INT의 수량)를 호출 할 때입니다 (수량) : 이것은 내가 물고기가 무엇을 수량을 설정할 수도 있습니다. 물고기 (INT의 수량이)라고하지만 현재

은, 그것은 소모품 대신 물고기의 소모품을 (호출 (수량))()

이가 난 방식으로 작동 갈 수있는 방법이 있나요 호출 찾고있어?

+1

가 대신 정적 팩토리 메소드를 사용하여 생각 해 봤나? – Dai

+2

기본 constractor에서 코드를 추출하여 InitDefaults 메서드에 넣고 두 constractors에서 호출 할 수 있습니다 –

+0

정적 팩토리 메서드가 무엇인지 모르겠습니다 – SuperMeip

답변

2

EDIT : 이미 일부 의견에서 제안 된 것처럼, 여기에 두 생성자에서 호출되는 init 메소드를 사용하여 해결할 수있는 해결책이 있습니다. Fish (qty)는 이제 기본 생성자와 자체 Init 메서드를 호출합니다 (Fish()와 동일).

public Fish() : base() { 
    Init(); 
} 

public Fish(int QTY) : base(QTY){ 
    Init(); 
} 

private void Init(){ 
    name = "fish"; 
    ID = 1; 
    variant = 0; 
    maxStack = 20; 
    desc = "A Fish of some kind"; 
    rarity = ItemRarity.Common; 
} 
+0

답변에 대해 더 자세히 설명해 주시기 바랍니다. 코드 전용 답변은 이해하기 어렵습니다. 그것은 당신이 당신의 포스트에있는 정보를 더 추가 할 수있는 경우에 둘 다 구경꾼 및 미래 독자를 도울 것이다. – RBT

1

CLR은 처음에는 Childclass보다 Baseclass 인스턴스를 생성합니다. 그리고 거기에 아무런 영향을 미치지 않습니다. 귀하의 경우에는 초기화 방법을 제안합니다. .net fiddle example

소모품 클래스

public void Initialize(){ 
    Console.WriteLine("Consumable.Initialize()"); 
    quantity = 1; 
} 

public void Initialize(int Quantity){ 
    Console.WriteLine("Consumable.Initialize(QTY)"); 

    if (quantity <= maxStack) 
     quantity = Quantity; 
    else 
     quantity = maxStack; 
} 

물고기

public Fish(int QTY){ 
    Initialize(QTY); 
} 

public void Initialize(){ 
    Console.WriteLine("Fish.Initialize()"); 
    name = "fish"; 
    ID = 1; 
    variant = 0; 
    maxStack = 20; 
} 

public void Initialize(int QTY) { 
    Console.WriteLine("Fish.Initialize(QTY)"); 
    Initialize(); 
    base.Initialize(QTY);  
} 

출력 :

enter image description here