Daarwin
Daarwin

Reputation: 3014

Derived constructor with type parameter

EDIT: added follow up question from getting a solution suggested from another question EDIT2: I just realised that my follow up question was not needed.

Is it possible to have an abstract base class with a type parameter of T have a constructor that takes a parameter of T and assigns it to a property of T? What i want to achieve is that all derived classes has a constructor that does this?

Something like:

 public abstract class NotificationBase <T>
{
    public string Text { get; set; }
    public T Context { get; set; }


    public NotificationBase(T context, string text)
    {
        Context = context;
        Text = text;
    }
}

public class NumberNotification : NotificationBase<int>{}

public class Program
{
    public void Run()
    {
        var thing = new NumberNotification(10, "Hello!");

    }
}

EDIT: I got a link to another question that explained how to do this which is great. However i have some issues with that. And i dont mean its wrong, if that is the only way to do it then thats how it is. However its not the ideal situation for what im trying to do. I explain. This was the solution:

    public class Base
{
    public Base(Parameter p)
    {
        Init(p)
    }

    void Init(Parameter p)
    {
        // common initialisation code
    }
}

public class Derived : Base
{
    public Derived(Parameter p) : base(p)
    {
 
    }
}

..which works great. However it does create two small issues that id like to se if they can be addressed.

  1. What i want is to force all classes that derives from the base to pass a T into the constructor so that its mandatory. With this solution, its possible to leave it out.
  2. If all classes should do this then it feels redundant to create a constructor to propagate a mandatory parameter.

EDIT: I just realised that demanding a constructor that propagates the type parameter IS what im looking for. I makes sure that the T property gets a value and also allows for other things to happen in the constructor.

Upvotes: 1

Views: 98

Answers (2)

user12031933
user12031933

Reputation:

Yes, you can, you just need to propagate the constructor chain using the relevant type, and call the ancestor if needed:

public class NumberNotification : NotificationBase<int>
{
  public NumberNotification(int context, string text) 
    : base(context, text)
  {
  }
}

Without constructor in child class, the instantiation you wrote can't compile because you don't offer a way for the compiler to know what to do.

You can also offer any other constructor needed.

Therefore now this compiles and works:

var thing = new NumberNotification(10, "Hello!");

Inheritance And Constructors (C# Corner)

base (C# Reference)

Upvotes: 3

user1672994
user1672994

Reputation: 10849

Define the parameterized constructor for NumberNotification class which should invoke the required constructor of NotificationBase using base

public class NumberNotification : NotificationBase<int>
{
    public NumberNotification(int context, string text)
        :base(context, text)
    {
    }
}

Now for NumberNotification object, context is type of int as here T is marked as int type which Yyou can check using below code:

var thing = new NumberNotification(10, "Hello!");
Console.WriteLine(thing.Context.GetType());

The above prints the output as System.Int32

Check the fiddle - https://dotnetfiddle.net/keufQO

Upvotes: 0

Related Questions