【问题标题】:How do I pass fewer arguments than the base constructor in to a derived constructor?如何将比基本构造函数更少的参数传递给派生构造函数?
【发布时间】:2013-11-15 20:37:50
【问题描述】:

我的情况如下。

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

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

我不想总是做Dog dog = new Dog( "fido", 4 ); 我宁愿只在 Dog 构造函数中使用“legs = 4”并只传递名称。

但是,每当我尝试将“腿”排除在构造函数之外时,它都会告诉我某些字段由于保护级别而无法访问。

我正在使用 getter 和 setter,它们都是公共的。

编辑:这是原始损坏的课程之一 -

    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 个参数都放入 new Soil() 中,我只想将每个 new Soil() 不同的 4 个放入其中,并让构造函数将其余参数设置为默认值。

这会产生错误,例如:“`Item.price' 由于其保护级别而无法访问”

【问题讨论】:

  • "我正在使用 getter 和 setter,它们都是公共的。" --- 他们在哪里?

标签: c# c#-4.0 constructor arguments


【解决方案1】:

我一定错过了什么。是不是就这么简单?

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

【讨论】:

    【解决方案2】:

    你可以这样做

    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 条腿的狗。

    【讨论】:

    • 我明白了,谢谢。我喜欢你仍然可以输入 3,如果你愿意的话,否则如果省略它会输入 4。我最初的想法是将它放在构造函数中但不传递它,只是将它放在正文中并完全省略参数。这不可能吗?
    猜你喜欢
    • 2012-12-10
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多