How to define derived class if the base class has generic constraints

Viewed 44

Im new to generics c#,

 public class Program
{
    static void Main(string[] args)
    {
    }
}


public class People
{

}

public interface IBaseClass<out T>
{
    T GetPeople(int t);
}

public interface IDerivedClass:IBaseClass<People>
{

}

public abstract class BaseClass<T> where T : People, IBaseClass<T>
{

}

public class Derived : BaseClass<People>, IDerivedClass
{

}

I get error while creating the Derived class, as I am new to generics, I don't know how to create derived class enter image description here

1 Answers

BaseClass<T> where T : People, IBaseClass<T> means that BaseClass<T> takes in a generic parameter that is required to be People and also implement IBaseClass<T> (which is IBaseClass<People>)

I think you didn't mean to have IBaseClass<T> as a generic parameter constraint right? I think you wanted BaseClass<T> to implement IBaseClass<T>.

In this case you should move IBaseClass<T> directly after BaseClass<T> like this:

public abstract class BaseClass<T> : IBaseClass<T> where T : People

This now means that BaseClass<T> implements IBaseClass<T> and T is required (constrained) to derive from People (or just be People).

Now you will get an error that BaseClass<T> needs to implement IBaseClass<T>.GetPeople, so just implement that and the code works.

Complete code snippet that works:

public class People {

}

public interface IBaseClass<out T> {
    T GetPeople(int t);
}

public interface IDerivedClass : IBaseClass<People> {

}

public abstract class BaseClass<T> : IBaseClass<T> where T : People {
    // this will force Derived to implement GetPeople
    public abstract T GetPeople(int t);
}

public class Derived : BaseClass<People>, IDerivedClass {
    public override People GetPeople(int t) {
        // need to implement this!
        throw new NotImplementedException();
    }
}
Related