logeeks
logeeks

Reputation: 4979

Parameterized abstract class constructor

I have a class like below

public abstract class ABC
{
    int _a;
    public ABC(int a)
    {
        _a = a;
    }
    public abstract void computeA();
};

Is it mandatory for the derived class to supply the parameters for the base/abstract class constructor? Is there any way to initialize the derived class without supplying the parameters?

Thanks in advance.

Upvotes: 4

Views: 23657

Answers (4)

Jon Skeet
Jon Skeet

Reputation: 1499740

Yes, you have to supply an argument to the base class constructor.

Of course, the derived class may have a parameterless constructor - it can call the base class constructor any way it wants. For example:

public class Foo : ABC
{
    // Always pass 123 to the base class constructor
    public Foo() : base(123)
    {
    }
}

So you don't necessarily need to pass any information to the derived class constructor, but the derived class constructor must pass information to the base class constructor, if that only exposes a parameterized constructor.

(Note that in real code Foo would also have to override computeA(), but that's irrelevant to the constructor part of the question, so I left it out of the sample.)

Upvotes: 21

Akram Shahda
Akram Shahda

Reputation: 14771

Add a default constructor to the base class and call the other constructor providing an initial values for its parameters:

public abstract class ABC
{
    int _a;  
    public ABC(int a)  
    {    
         _a = a;   
    }

    public ABC() : this(0) {}    
}

Upvotes: 1

Yochai Timmer
Yochai Timmer

Reputation: 49221

It doesn't have much to do with the fact that the base class is abstract.

Because you've declared a public constructor that has 1 parameter, the compiler removes the basic empty constructor.

So, if you want to create an instance of that class, you have to pass a parameter.

When you derive from such a class, a parameter must be passed to the base class for it o construct.

Upvotes: 0

Colin Mackay
Colin Mackay

Reputation: 19175

You can create a default constructor in a derived class that does not need parameters and the derived class will supply default values, but you cannot remove the requirement entirely. It is a manadatory condition of the base class to have some sort of value.

public MyDerivedClass : ABC
{
  public MyDerivedClass()
    : base(123) // hard wired default value for the base class
  {
    // Other things the constructor needs to do.
  }

  public override void computeA()
  {
    // Concrete definition for this method. 
  }
}

Upvotes: 4

Related Questions