C#:简单的多重继承/mixin 替换?

标签 c#

我有一个来自外部库的类,我需要将其扩展到另一个类中。此外,扩展应该保持可重用性,因为我也需要在其他地方实现它们。

由于 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,但是这会导致大量重复,因为 ExtensionsProperties 的字段数量> 相当高(并且在开发阶段它们变化很大)。


有什么最佳实践吗?

最佳答案

如何将这些类的实例聚合到 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 的自动实现的属性。

PropertiesExtensions 的所有更改将自动反射(reflect)在 MyModel 中。聚合是一种以面向对象的方式使用设计模式的常见方式,与类方式相反,后者通常使用多重继承。

至于多态性问题,您可以创建一个派生类,覆盖您想要的任何行为并将该类的一个实例传递给构造函数。

关于C#:简单的多重继承/mixin 替换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32977827/

相关文章:

c# - 在没有 "save as.."的情况下从 asp.net 本地保存文件? ActiveX 是唯一的解决方案吗?

c# - 在 C# 中将一个 byte[] 拆分为多个 byte[] 数组

java - C# 创建的新进程无法访问某些文件

c# - WCF 中 MustUnderstand 属性的用途是什么?

c# - 奇怪的报告查看器错误 : Could not load file or assembly 'App_WebReferences. e8ik1wuc

c# - 在 C# 中一般创建对象

c# - Linq2Sql 数据上下文登录/注销行为

c# - 如果联接中有多个字段,您如何在 Linq 中离开联接?

c# - C# 库读取 Excel 2007 xlsm 文件?

c# - Azure 无法访问存储在应用服务配置中的连接字符串