Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在继承中使用this()和base()_C#_Inheritance_Unity3d_This_Base - Fatal编程技术网

C# 在继承中使用this()和base()

C# 在继承中使用this()和base(),c#,inheritance,unity3d,this,base,C#,Inheritance,Unity3d,This,Base,所以我在c#中创建了一个库存系统,其中每个项目都是从其他类继承的类。目前我正在开发一些测试类,其中一个是Fish。 Fish继承自从项目继承的耗材(顶级类) 注:耗材基本上是可堆叠的物品 我想在消耗品类中创建两个默认构造函数,一个不带参数: public Consumable() : base() { quantity = 1; } 只需将数量设置为1 一个取一个参数,数量: public Consumable(int Quantity) : this() { if (quan

所以我在c#中创建了一个库存系统,其中每个项目都是从其他类继承的类。目前我正在开发一些测试类,其中一个是Fish。 Fish继承自从项目继承的耗材(顶级类) 注:耗材基本上是可堆叠的物品

我想在消耗品类中创建两个默认构造函数,一个不带参数:

public Consumable() : base() {
    quantity = 1;
}
只需将数量设置为1

一个取一个参数,数量:

public Consumable(int Quantity) : this() {
    if (quantity <= maxStack)
        quantity = Quantity;
    else
        quantity = maxStack;
}
我希望在调用Fish(int QTY)时,调用Fish()来设置基础,然后调用耗材(QTY)来设置数量

但是,当前,当调用Fish(int QTY)时,它调用consulate(QTY),后者调用consulate()而不是Fish()


有没有什么方法可以让它以我所期待的方式工作?

编辑:正如一些评论中已经建议的那样,这里有一个可能的解决方案,它使用一个init方法,从两个构造函数调用。Fish(qty)现在调用基本构造函数和自己的Init方法(与Fish()相同)


编辑:正如在一些评论中已经建议的那样,这里有一个可能的解决方案,使用从两个构造函数调用的init方法。Fish(qty)现在调用基本构造函数和自己的Init方法(与Fish()相同)


CLR首先只创建基类实例,而不创建子类。没有办法影响它。在您的情况下,我建议创建方法Initialize

消耗品类别

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;
 }
输出:


CLR首先只创建基类实例,而不创建子类。没有办法影响它。在您的情况下,我建议创建方法Initialize

消耗品类别

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;
 }
输出:


您考虑过使用静态工厂方法吗?您可以将代码从默认构造函数提取到
InitDefaults
方法,并从两个构造函数调用。我不确定静态工厂方法isI将如何将代码重构为类似
Init
-的方法。您考虑过使用静态工厂方法吗?您可以将代码从默认构造函数提取为
InitDefaults
方法,从两个构造函数调用它。我不确定静态工厂方法isI将如何将代码重构为类似
Init
的方法。只有代码的答案很难理解。如果你能在你的帖子中添加更多的信息,这将有助于提问者和未来的读者。我想请你在你的答案周围添加更多的上下文。只有代码的答案很难理解。如果你能在你的文章中添加更多的信息,这将有助于询问者和未来的读者。
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);       
}