有没有办法从具有内部构造函数的类派生?

wil*_*ill 9 c# constructor design-patterns

我正在使用第三方c#类,它有很多很棒的方法和属性 - 但随着时间的推移,我需要使用自己的方法和属性来扩展该类.如果是我的代码,我会将该类用作我的基类并在顶部添加我自己的属性和方法 - 但是这个类有一个内部构造函数.(在我看来,最初只是将构造函数设置为内部 - 为什么要限制子类的能力?)

我唯一能想到的就是在我的班级上创建方法/属性,这些方法/属性只是简单地调用了他们的 - 但它是一大堆代码,而且,它只是没有"感觉"正确.

有没有办法将这个类用作基类?

Jon*_*eet 6

你问:"为什么要限制子类的能力?"

因为继承设计很棘手,特别是如果你正在为其他开发人员设计继承你的类.正如Josh Bloch在Effective Java中所说,你应该设计继承或禁止它.在我看来,除非你有充分的理由设计继承,否则你不应该这样推测.

该类是否实现了一个你也可以实现的接口(可能通过将大多数回调代理回原始实例)?这里通常没有非常优雅的答案 - 最好的解决方案将取决于具体情况,包括您尝试添加到课堂中的内容.

如果你没有添加任何更多的状态 - 只是方便的方法,有效 - 那么扩展方法可能适合你.但是它们不会更改对象能够存储的数据,因此如果您需要添加自己的专用数据,那将无法正常工作.


Bog*_*_Ch 0

我不会讨论您是否可以围绕第 3 方类构建自己的外观。以前的作者是对的,图书馆的设计方式可能不允许这种情况。假设他们有一些耦合的类,这些类具有应按特定顺序初始化的单例或类似的东西 - 可能存在很多 3rd 方开发人员从不关心的设计错误(或功能),因为他们不认为您会使用他们的图书馆就是这样。

但是好吧,让我们假设构建一个外观并不是一项不可能完成的任务,而且实际上只有一个问题 - 您必须编写包装器的方法太多,并且手动执行此操作并不好。

我看到了 3 个解决方案来解决这个问题

1)我认为.NET 4.0的新“动态”类型将允许您解决该问题,而无需编写“大量代码”您应该使用dynamic关键字将第3方类的实例作为私有成员封装到您的类中类应从 Dynamic 派生或实现 IDynamicObject 接口。您必须实现 GetMember/SetMember 函数,将所有调用转发到第 3 方类的封装实例

好吧,c# 4.0 是未来,让我们看看其他解决方案:

2) 如果您有大量公共方法(例如超过 100 个),请不要手动编写代码。我会编写一个小控制台应用程序,它使用反射并查找所有公共成员,然后自动生成代码来调用封装的实例。例如

public type MethodName(params)
{
   this.anInstanceOf3rdPartyClass.MethodName(params);
}
Run Code Online (Sandbox Code Playgroud)

3) 您可以执行与 2 相同的操作,但要借助现有反射工具,例如 RedGate .NET Reflector。它将帮助您列出所有类和方法签名。然后,将所有这些内容粘贴到 Word 中,一个简单的 VB 宏将让您生成与 2 中相同的代码。 备注:只要您不复制代码,而仅复制公开可用的方法签名,我我认为您不会违反许可协议,但无论如何值得重新检查