1

假设我有这门课:

class foo
{
    public foo(Guid guid)
    {
        //some code here
    }

    public foo(Guid guid, bool myBool)
    {
        //some other code here
    }

    //Here I have a bunch of method/properties

    public void GenX(bool french, int width)
    {
        //my method implementation
    }
}

我有另一个类,foo除了这个方法的实现public GenX(bool french, int width)和构造函数必须与foo's 的实现不同之外,它的作用基本相同。

如果我bar以这种方式实现,编译器会抱怨:'foo' does not contain a constructor that takes '0' arguments

class bar : foo
{
    public bar(Guid guid, bool myBool)
    {
        //some code here
    }

    new public void GenX(bool french, int width)
    {
        //my new method implementation
    }

    //I will be using the implementation of `foo` for the rest of the methods/properties
}

我究竟做错了什么?这是做这种事情的正确方法吗?

如果这还不够清楚,我很抱歉,我会尽量让它更清楚

4

2 回答 2

8

您必须确保调用了基本构造函数。

你可以这样做:

class bar : foo
{
    public bar(Guid g, bool b) : base (g)
    {
        // code here
    }
}

由于您没有在代码中指定它,编译器将尝试默认/隐式调用默认构造函数。但是,由于您的基类没有默认构造函数(因为您指定了另一个构造函数,但没有指定默认构造函数),它无法调用它。因此,您必须告诉编译器它应该使用哪个基类的构造函数。

如果继承类中的构造函数与基类中的构造函数完全不同,并且您不希望重用基类的构造函数,则可以这样做:

class foo
{
   protected foo() 
   { 
      // default constructor which is protected, so not useable from the 'outside' 
   }

   public foo( Guid g ) 
   {}

   public foo( Guid g, bool b) : this(g) 
   {}

   public virtual void GenX() {}
}

class bar : foo
{
   public bar( Guid g, bool b) : base()
   {}

   public override void GenX() {}
}
于 2013-09-03T12:40:47.943 回答
0

试试这个 :

class foo
{
    public foo(Guid guid)
    {
        //some code here
    }

    public foo(Guid guid, bool myBool,bool fooclass = true)
    {

        if (fooclass)
        {
            //some other code here
        }

    }

    //Here I have a bunch of method/properties

    public void GenX(bool french, int width)
    {
        //my method implementation
    }
}

class bar : foo
{
    public bar(Guid guid, bool myBool,bool barclass = true) : base(guid,myBool,false)
    {
        //some code here
    }

    new public void GenX(bool french, int width)
    {
        //my new method implementation
    }
}                                 
于 2013-09-03T13:10:37.627 回答