Valentin Vasilev
Valentin Vasilev

Reputation: 111

How to restrict a generic type parameter to child classes?

I'm trying to do something like that:

    internal class ConcreteLinkedItem : GenericLinkedItem<ConcreteLinkedItem>
    { //Specific methods which use GenericLinkedItem
    }
    internal class GenericLinkedItem<TItem>
        where TItem : GenericLinkedItem<TItem>
    {
        public TItem? Next { get; private set; }
        public TItem? Previous { get; private set; }

        public void AttachNext(TItem item)
        {
            Next = item;
//Error CS0266 Cannot implicitly convert type 'GenericLinkedItem<TItem>' to 'TItem'...  
            item.Previous = this; 

        }
    }

The only solutions I have in mind are:

            item.Previous = (TItem)this;

        public void AttachPrevious(TItem item)
        {
            Previous = item;
            item.Next = GetThis();
        }

        protected abstract TItem GetThis();

Any beautiful ideas?

PS: For now I go with "protected abstract TItem This { get; }". Which still is not what I want as you can mix different item (node) types, but is at least type safe:

    internal class ConcreteLinkedItem : GenericLinkedItem<ConcreteLinkedItem>
    { //Specific methods which use GenericLinkedItem
        protected override ConcreteLinkedItem This => this;
    }
    internal abstract class GenericLinkedItem<TItem>
        where TItem : GenericLinkedItem<TItem>
    {
        public TItem? Next { get; private set; }
        public TItem? Previous { get; private set; }

        public void AttachPrevious(TItem item)
        {
            Previous = item;
            item.Next = This;
        }

        protected abstract TItem This { get; }
    }

Upvotes: 2

Views: 378

Answers (0)

Related Questions