我正在读这段代码:
private static WaveFormat WaveFormatFromBlob(Blob blob){
if(blob.Length == 40)
return (WaveFormatExtensible)Marshal.PtrToStructure(blob.Data, typeof(WaveFormatExtensible));
return (WaveFormat)Marshal.PtrToStructure(blob.Data, typeof (WaveFormat));
}
如果将returnvalue声明为WaveFormat,我该如何返回WaveFormatExtensible?接下来的问题是:如何在调用例程中区分返回给我的类型并选择相应的赋值?我需要在一个或另一个中更改参数,具体取决于它的类型。我知道这是基本的c#,但我只是不明白。
答案 0 :(得分:1)
我认为代码的结构基本上是这样的
public class WaveFormatExtensible : WaveFormat
{
...
}
这意味着从返回基类WaveFormat
的方法返回扩展对象WaveFormatExtended
,通过上面的方法将其转换为WaveFormat
答案 1 :(得分:1)
documentation说(强调我的):
WAVEFORMATEXTENSIBLE结构定义了波形音频数据的格式,该格式具有超过两个通道或更高的样本分辨率,而不是WAVEFORMATEX允许的格式。 它还可以用于定义WAVEFORMATEX可以定义的任何格式。
因此C ++中的两个结构之间存在一些兼容性。 (实际上Format
的{{1}}是WAVEFORMATEXTENSIBLE
)。
我想从C ++到C#的映射将其实现为派生的类 ,这意味着WAVEFORMATEX
扩展了WaveFormatExtensible
。如果是这样,WaveFormat
的实例是WaveFormatExtensible
的有效返回类型。
答案 2 :(得分:1)
根据this,WaveFormatExtensible
是WaveFormat
的子类型:
public class WaveFormatExtensible : WaveFormat
那么,你所看到的是Liskov Substitution Principle:
可替代性是面向对象编程的一个原则。它 说明,在计算机程序中,如果 S(WaveFormatExtensible)是 T(WaveFormat)的子类型,那么 类型为T的对象可以用S 对象替换(即, 类型S的对象可以替换类型为T)的对象而不改变 该程序的任何理想属性(正确性,任务 表演等。)。
由于WaveFormatExtensible
派生自WaveFormat
,因此它有资格作为该方法的返回类型。