Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为此使用继承或组合,还是使用其他解决方案?_C#_.net_Inheritance_Composition - Fatal编程技术网

C# 为此使用继承或组合,还是使用其他解决方案?

C# 为此使用继承或组合,还是使用其他解决方案?,c#,.net,inheritance,composition,C#,.net,Inheritance,Composition,我有一个API,我必须通过包装提供更高级别、更友好、更精简的框架 此API已与其非托管版本完全相同。但它有各种各样的非直观的成员名称、工作流等 我使用组合来存储对底层类型的引用,这样我就可以按照我想要的方式拥有成员。基本上,将某些函数转换并组合为属性,使用其他一些较低级别的逻辑实现较高级别的功能,等等 public class Effect { public IEffect {get; private set;} ... } 但是我开始思考的一件事是,因为原始的C++ API是

我有一个API,我必须通过包装提供更高级别、更友好、更精简的框架

此API已与其非托管版本完全相同。但它有各种各样的非直观的成员名称、工作流等

我使用组合来存储对底层类型的引用,这样我就可以按照我想要的方式拥有成员。基本上,将某些函数转换并组合为属性,使用其他一些较低级别的逻辑实现较高级别的功能,等等

public class Effect
{
    public IEffect {get; private set;}
    ...
}
<>但是我开始思考的一件事是,因为原始的C++ API是基于继承和虚拟方法的,我应该如何去“曝光”/包装/链接这些?

我是否应该提供调用
internalType.VirtualMethod()
等的其他方法?但这似乎是行不通的,对吧

但另一方面,如果我自己使用继承,比如:

public class Effect : IEffect
然后我会有所有这些成员和奇怪的obsolote函数。我仍然可以提供更高级别的功能,但我不想展示这些成员,因为有很多原因,其中最简单的一个原因是他们不像.NET


您建议如何实现这一点?

编写一个包装器类。从长远来看,你会很高兴你做到了。

编写一个包装器类。从长远来看,你会很高兴你做到了。

谢谢,但你是什么意思?使用构图?因为我已经这样做了。或者你是说别的什么?我想说编写包装器类意味着组合,而不是继承。是的,组合。利用API的最佳部分开发自己的类。如果您使用继承并公开所有不需要的公共API方法和属性,那么很难恢复损坏。谢谢,但我如何从原始类型提供虚拟方法?我真的不知道原始类型是什么,也不知道您打算如何使用它们,所以很难说,但是原始类型应该可以作为返回类型或参数使用,因为您必须在发布DLL时包含API。谢谢,但这是什么意思?使用构图?因为我已经这样做了。或者你是说别的什么?我想说编写包装器类意味着组合,而不是继承。是的,组合。利用API的最佳部分开发自己的类。如果您使用继承并公开所有不需要的公共API方法和属性,那么很难恢复损坏。谢谢,但我如何从原始类型提供虚拟方法?我真的不知道原始类型是什么,也不知道您打算如何使用它们,所以很难说,但是原始类型应该可以作为返回类型或参数使用,因为您必须在发布DLL时包含API。