继承抽象类的不同具体实现

时间:2021-01-03 09:53:53

标签: c# oop inheritance

有一个基本的抽象类Subj

public abstract class Subj
{
    public IName name;
    public string ID { get; set; }
    //other members of the class
}

它有 2 个派生类:CompanyPerson

public class Company : Subj
{
    //realise interface IName
    public new  IName name = new NameCompany();
}

public class Person : Subj
{
    //realise interface IName
    public new IName name = new NamePerson();
}

还有 Client 类可以扩展 Subj

的功能
public class Client : Subj
{
    //Client functionality
    //Gets folder name for a client
    public string foldername()
    {
    }
    //The list of Legal cases
    private List<LCase> _cases = new List<LCase> { };
}

问题是,Subj 必须实现为 CompanyPerson,然后它可能会或可能不会“扩展”为 Client,这让我想到从ClientCompany继承Person,但是禁止多重继承,如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

该问题与混合祖先的多重继承无关。

使用组合和泛型可能会解决问题,但由于泛型参数约束还不允许 OR 运算符,您可以在构造函数中检查类型以在运行时抛出设计异常。

这是一个黑客:

public class Client<T> where T : Subj, new()
{
  readonly T Item = new T();
  public Client()
  {
    var type = typeof(T);
    if ( type != typeof(Person) && type != typeof(Company) )
    {
      string msg = "Generic type parameter for Client must be Person or Company."
                 + Environment.NewLine
                 + type.Name + " provided.";
      throw new TypeAccessException(msg);
    }
  }
}

您可以重构它以使用允许的类型列表。

您应该能够使用界面设计,但如果我正确理解了问题,那会使事情复杂化并减少您想要的输入。

如果允许所有Subj子项,则无需检查类型。

用法:

public class OtherSubj : Subj
{
}

var clientPerson = new Client<Person>();    // ok
var clientCompany = new Client<Company>();  // ok
var clientOther = new Client<OtherSubj>();  // exception

您还可以创建类:

public class ClientPerson : Client<Person>
{
}

public class ClientCompany : Client<Company>
{
}

您可以发布复合实例并将其命名为您想要的名称:

public readonly T Item = new T();

或提供属性和方法包装器:

private readonly T Item = new T();

public IName name 
{ 
  get => Item.name;
  set => Item.name = value;
}