我有一个来自外部库的类,我需要将其扩展到另一个类中。此外,扩展应该保持可重用性,因为我也需要在其他地方实现它们。
由于 C# 中既不支持混合也不支持多重继承,解决这个问题的常用方法是什么?
namespace ExtLib
{
public class Properties
{
public virtual int fieldN { get; set; }
}
}
namespace MyLib
{
public class Extensions
{
public virtual int fieldM { get; set; }
}
}
namespace MyProject
{
public class MyModel
{
// needs to have all fields from ExtLib.Properties AND MyLib.Extensions
}
public class MyOtherModel
{
// needs to have all fields from MyLib.Extensions,
// MyLib.Extensions should be reusable
}
}
我知道一个解决方案可能是接口(interface) IExtensions
,但是这会导致大量重复,因为 Extensions
和 Properties
的字段数量> 相当高(并且在开发阶段它们变化很大)。
有什么最佳实践吗?
最佳答案
如何将这些类的实例聚合到 MyModel
中?
public class MyModel
{
private Properties _properties;
private Extensions _ extensions;
public MyModel(Properties properties, Extensions extensions)
{
_properties = properties;
_extensions = extensions;
}
public Properties Prop
{
get { return _properties; }
}
public Extensions Ext
{
get { return _extensions; }
}
}
或者,您当然可以摆脱手动支持字段,并使用具有公共(public) getter 和私有(private) setter 的自动实现的属性。
对 Properties
和 Extensions
的所有更改将自动反射(reflect)在 MyModel
中。聚合是一种以面向对象的方式使用设计模式的常见方式,与类方式相反,后者通常使用多重继承。
至于多态性问题,您可以创建一个派生类,覆盖您想要的任何行为并将该类的一个实例传递给构造函数。
关于C#:简单的多重继承/mixin 替换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32977827/