2013-11-05 56 views
0

我的情况类似于以下内容。如何将基础构造函数的参数传递给派生构造函数?

public abstract class Mammal{ public Mammal(name, legs){ ... } } 

public class Dog{ public Dog(name, legs) : base (name, legs) { ... } } 

我不想总是做Dog dog = new Dog("fido", 4);我宁愿只是有“腿= 4”中的狗构造,并通过在只有名称。

但是,每当我尝试从构造函数中留下“腿”时,它会告诉我某些字段由于保护级别而无法访问。

我正在使用getters和setters,它们都是公共的。

编辑:这里是原来破类之一 -

public Soil(int idNo, string soilName, string prefabName) 
: base(idNo, soilName, price, weight, size, madeOf, prefabName, iconName){ 

      Price = 0; 

    Capacity = 1; 
    CanHoldSizes = new ContainerSizes[] {ContainerSizes.seed}; 
    Contents = new Item[Capacity];  
} 

而不必把所有8个参数在新的土壤()的,我想只是把4这将是不同的每个新的土壤(),并有构造函数将其余设置为默认值。

这就产生错误,如:“'Item.price”不可访问由于其保护级别”

+0

“我正在使用getter和setters,它们都是公开的。” - - 他们在哪? – zerkms

回答

4

你可以做到这一点

public class Dog 
{   
    public Dog(string name) : base (name, 4) { } 

    //OR this 

    public Dog(string name, int legs = 4) : base (name, legs) { } 
} 

第一个构造函数总是会创建一个哺乳动物有4个腿。

第二个将允许你这样做new Dog("MyDog")但编译器将用new Dog("MyDog",4)替换此代码。

当然,使用第二个,你仍然可以做到这一点new Dog("MyDog",3),它会创建一条3条腿的狗。

+0

我明白了,谢谢。我喜欢,如果你愿意的话,你仍然可以输入3,否则如果被排除,它会输入4。我最初的想法是把它放在构造函数中,但不要传入它,只要把它放在主体中并完全抛弃这个论点。这不可能吗? – Olgo

3

我必须失去了一些东西。这不是很简单吗?

public class Dog 
{ 
    public Dog(string name) : base (name, 4) 
    { 
    } 
} 
相关问题