我想重用一个现有class
的第三方库,但它没有实现一些必需的接口。我正在考虑将它包装在 astruct
中以实现所需的接口(基本上就像 Scala 的做法一样)。我更喜欢这个struct
用class
例的原因是因为它只存储一件事:被包装的对象,而且它可能不会导致性能损失?但是我不确定如果我将 a 传递struct
给某个采用接口的方法是否会发生装箱?这种方法还有其他缺点吗?
3 回答
Microsoft 给出了非常明确和直接的理由,您应该使用 astruct
而不是 a class
:
√ 如果类型的实例很小且通常短暂存在或通常嵌入在其他对象中,请考虑定义结构而不是类。
X 避免定义结构,除非该类型具有以下所有特征:
- 它在逻辑上表示单个值,类似于原始类型(int、double 等)。
- 它的实例大小小于 16 个字节。
- 它是不可变的。
- 它不必经常装箱。
https://msdn.microsoft.com/en-us/library/ms229017.aspx
似乎这不是你的情况。顺便说一句,是的,如果您将 a 传递struct
给采用interface
. 还要考虑到结构不支持继承,它们不能有明确的无参数构造函数。
是的,在这种情况下,如果您不想同时实现两个接口(现有的 + 要添加的额外内容),您可以在这种情况下使用 struct。包装不会有任何开销,因为 struct 将只存储引用而不是整个对象。因为对象将始终通过引用访问,即存储在堆上。所以不会有任何性能惩罚。但是不推荐的做法
但是,如果您有可以同时使用两种接口实现的情况,您应该定义一个新的派生类,该类将有一个变量来存储基类的对象。这样,您可以使用派生类的对象并将指向基类对象的变量保持为空。
参考http://adarshdchaurasia.wordpress.com/2013/08/12/decorator-design-pattern/了解实施的细节。
另请参阅你可以在结构中有一个类吗?
更简单的是直接在您的代码中继承 3rd-party 类,然后在此派生类上实现您想要的接口。没有拳击;只有引用会被传递。