【问题标题】:Base Class Doesn't Contain Parameterless Constructor?基类不包含无参数构造函数?
【发布时间】:2011-12-03 03:14:52
【问题描述】:

我通过删除一些空的构造函数来使我的构造函数更加严格。我对继承很陌生,并且对我得到的错误感到困惑:基类不包含无参数构造函数。如何在 A 中没有空构造函数的情况下使 A2 从 A 继承。另外,根据我个人的理解,为什么 A2 需要 A 的空构造函数?

Class A{
    //No empty constructor for A
    //Blah blah blah...
}

Class A2 : A{
    //The error appears here
}

【问题讨论】:

  • 你不能创建一个没有构造函数的类的对象。如果您不希望无参数创建一个接受一些参数的构造函数。
  • 我应该在OP中更清楚,A类和A2都有带参数的构造函数,我只是想删除无参数的构造函数,以便创建一个类的实例,你需要所有类工作的必要参数。这似乎是一种直观的做法,这是一种聪明的做事方式吗?

标签: c# constructor


【解决方案1】:

在A2类中,你需要确保你所有的构造函数都调用带有参数的基类构造函数。

否则,编译器将假定您要使用无参数基类构造函数来构造 A2 对象所基于的 A 对象。

例子:

class A
{
    public A(int x, int y)
    {
        // do something
    }
}

class A2 : A
{
    public A2() : base(1, 5)
    {
        // do something
    }

    public A2(int x, int y) : base(x, y)
    {
        // do something
    }

    // This would not compile:
    public A2(int x, int y)
    {
        // the compiler will look for a constructor A(), which doesn't exist
    }
}

【讨论】:

  • 我以前从未见过这个,但这正是诀窍。非常感谢!
  • 事实证明,如果您将其他构造函数设置为使用带参数的基本构造函数,则可以忽略无参数构造函数。 IE。 A2 中的第二个定义是唯一需要的。
  • @Tyeth 真的!但是,如果基类中没有无参数构造函数,则每个构造函数都必须显式调用基类构造函数。如果没有指定基类构造函数,编译器会尝试在基类中寻找一个无参数的构造函数。
  • 如果您尝试使用注入的日志记录来执行此操作,则最好使用派生的基类装饰器或观察者记录器来处理此类横切关注问题。
【解决方案2】:

例子:

class A2 : A
{
   A2() : base(0)
   {
   }
}

class A
{
    A(int something)
    {
        ...
    }
}

【讨论】:

  • 将基类放在不同的文件中更为常见。
【解决方案3】:

如果您的基类没有无参数构造函数,则需要使用base 关键字从派生类中调用一个:

class A
{
    public A(Foo bar)
    {
    }
}

class A2 : A
{
    public A2()
        : base(new Foo())
    {
    }
}

【讨论】:

    【解决方案4】:

    必须调用一些构造函数。默认是调用base()

    您还可以在对base() 的调用中使用静态方法、文字和任何参数来调用当前构造函数。

      public static class MyStaticClass
        {
            public static int DoIntWork(string i)
            {
                //for example only
                return 0;
            }
        }
    
        public class A
        {
            public A(int i)
            {
            }
        }
    
        public class B : A
        {
            public B(string x) : base(MyStaticClass.DoIntWork(x))
            {
            }
        }
    

    【讨论】:

      【解决方案5】:

      因为如果 A 没有默认构造函数,那么 A2 的构造函数需要使用 A 的构造函数的参数调用 base()。请参阅此问题:Calling the base constructor in C#

      【讨论】:

        【解决方案6】:

        当你创建派生类的对象时,你的基类构造函数会被自动调用。所以在你创建派生类对象时,你的派生类对象没有构造函数接受一个或多个参数,不会有任何东西传递给需要一个参数的基类构造函数。 为此,您需要将一些内容传递给基类构造函数,如下所示:

        Class A{
            //No empty constructor for A
            //Blah blah blah...
        }
        
        Class A2 : A{
            public A2():base(some parameter)
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-30
          • 1970-01-01
          • 2011-10-08
          • 2014-04-14
          • 2015-12-02
          相关资源
          最近更新 更多