1

Let's assume I have a business case I want to use some model to represent a master-child structure. And there will be certain classes to inherit from both the master class and child class.

I use the sample below

public abstract class BaseChild
{
    public int MyProperty { get; set; }
}

public abstract class BaseMaster
{
    public abstract ReadOnlyCollection<BaseChild> Children { get; }
}

Now I need real classes to inherit from them. So have following

public class FirstRealChild : BaseChild
{
    public int AdditionalProperty { get; set; }
}

public class FirstRealMaster : BaseMaster
{
    public ReadOnlyCollection<FirstRealChild> Children { get; }
}

Of course it won't compile because of the error

'FirstRealMaster' does not implement inherited abstract member 'BaseMaster.Children.get'

I can remove the public abstract ReadOnlyCollection<BaseChild> Children { get; } from BaseMaster class, but it loses the constraint to all inherited classes that children are required.

Anybody has some better idea?

hardywang
  • 4,864
  • 11
  • 65
  • 101

2 Answers2

3

You may get somewhere with generics:

public abstract class BaseMaster<TChild> where TCHild : BaseChild
{
    // this probably doesn't have to be 'abstract' anymore
    public abstract ReadOnlyCollection<TChild> Children { get; }
}

public class FirstRealMaster : BaseMaster<FirstRealChild>
{
}

But we don't know enough about the relation between Master and Child classes to be sure.

H H
  • 263,252
  • 30
  • 330
  • 514
0

Generics + potentially non-generic base class for your "with children" type is the standard solution. If you don't need BaseMaster to be assignment-compatible between different types of child nodes you can remove base non-generic class.

Something roughly like following:

public class BaseMaster
{
    public ReadOnlyCollection<BaseChild> Children { get; }
}

public class BaseMaster<T> : BaseMaster where T: BaseChild
{
    public new IEnumerable<T> Children { get
        {
           return base.Children.Cast<T>();
        };
    }
}
Alexei Levenkov
  • 98,904
  • 14
  • 127
  • 179