有一个基本的抽象类Subj
:
public abstract class Subj
{
public IName name;
public string ID { get; set; }
//other members of the class
}
它有 2 个派生类:Company
和 Person
:
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
必须实现为 Company
或 Person
,然后它可能会或可能不会“扩展”为 Client
,这让我想到从Client
和Company
继承Person
,但是禁止多重继承,如何解决这个问题?
答案 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;
}