使用另一个接口扩展一个接口
本文关键字:接口 一个 扩展 另一个 | 更新日期: 2023-09-27 18:36:04
大家好,
我有一个关于接口以及它们如何相互扩展/继承的问题。这个问题与GPU编程关系不大。
问题:
我有两个接口:GPUImageView 和 GPUImageInput。
GPU ImageView 被定义为:interface GPUImageView : GPUImageInput { /*some code*/ }
我有一个功能:void AddTarget(GPUImageInput newTarget) {/*some code*/}
当我将 GPU mageView 的实例传递到 AddTarget 时,我收到一个错误,它无法将 GPU ImageView 转换为 GPUImageInput。
附加信息:
我正在尝试将 Monotouch 中的 GPU mage 库与 btouch 绑定。我试图移植他们的一个示例(SimplePhotoFilter)作为测试。
这导致了
- 我放在ViewDidLoad方法中的democode。
- APIDefinitions.cs我用必要的绑定填充了它。
- 结构体和枚举.cs暂时为空。
以下是 API 中的代码.cs
namespace GPUImage
{
[BaseType (typeof(UIView))]
interface GPUImageView : GPUImageInput{
[Export ("initWithFrame:")]
IntPtr Constructor(RectangleF frame);
[Export ("autoresizingMask")]
UIViewAutoresizing AutoResizingMask { get; set;}
[Export ("addSubView")]
void AddSubView(UIView view);
}
[BaseType (typeof(NSObject))]
[Model]
interface AVCaptureVideoDataOutputSampleBufferDelegate{
}
[BaseType (typeof(NSObject))]
[Model]
interface AVCaptureAudioDataOutputSampleBufferDelegate{
}
[BaseType (typeof(GPUImageOutput))]
interface GPUImageVideoCamera : AVCaptureVideoDataOutputSampleBufferDelegate, AVCaptureAudioDataOutputSampleBufferDelegate{
}
[BaseType (typeof(GPUImageVideoCamera))]
interface GPUImageStillCamera{
[Export ("outputImageOrientation")]
UIInterfaceOrientation OutputImageOrientation { get; set;}
[Export ("startCameraCapture")]
void StartCameraCapture();
}
[BaseType (typeof(GPUImageSobelEdgeDetectionFilter))]
interface GPUImageSketchFilter{
[Export ("prepareForImageCapture")]
void PrepareForImageCapture();
}
[BaseType (typeof(GPUImageTwoPassFilter))]
interface GPUImageSobelEdgeDetectionFilter {
[Export ("texelWidth")]
float TexelWidth{ get; set;}
[Export ("texelHeight")]
float TexelHeight{ get; set;}
}
[BaseType (typeof(GPUImageFilter))]
interface GPUImageTwoPassFilter {
}
[BaseType (typeof(GPUImageOutput))]
interface GPUImageFilter : GPUImageInput{
}
[BaseType (typeof(NSObject))]
[Model]
interface GPUImageInput{
}
[BaseType (typeof(NSObject))]
interface GPUImageOutput{
[Export ("addTarget")]
void AddTarget(GPUImageInput newTarget);
}
}
这是 viewController 中的代码:
GPUImage.GPUImageStillCamera stillCamera = new GPUImage.GPUImageStillCamera ();
stillCamera.OutputImageOrientation = UIInterfaceOrientation.Portrait;
GPUImage.GPUImageFilter filter = (GPUImage.GPUImageSketchFilter)new GPUImage.GPUImageSketchFilter ();
((GPUImage.GPUImageSketchFilter)filter).TexelHeight = 1.0f / 1024.0f;
((GPUImage.GPUImageSketchFilter)filter).TexelWidth = 1.0f / 768.0f;
((GPUImage.GPUImageSketchFilter)filter).PrepareForImageCapture ();
stillCamera.AddTarget (filter);
GPUImage.GPUImageView filterView = (GPUImage.GPUImageView)this.View;
filter.AddTarget (filterView);
这些是我收到的错误消息:ImageProcessingLabViewController.cs(37,37): 错误 CS1503:将 GPUImage.GPUImageOutput' 表达式#1' cannot convert
为键入"GPUImage.GPUImageInput"(CS1503) (ImageProcessingLab) 的参数
' 表达式#1' cannot convert
参数键入"GPUImage.GPUImageInput" (CS1503) (ImageProcessingLab)
但正如你所看到的,GPUImageFilter 继承/实现/扩展了 GPUImageInput,这应该允许我使用/转换 GPUImageSketchFilter、GPUImageOutput 和 GPUImageView 作为 GPUImageInput。
澄清:当我尝试调用需要GPUImageInput的AddTarget时,会发生错误。我给它一个GPUImageFilter,它继承自GPUImageOutput并实现GPUImageInput。GPU MageFilter 应该可转换为 GPUImageInput,但会导致错误。
感谢任何答案。我错过了什么吗?谢谢!
我不熟悉该特定框架,但是,实现的硬件选项有限。
如果库对图像使用 GPGPU(例如 CUDA)缓冲区,则输入和输出图像不会有单独的定义(也许基于纹理内存的快速访问只读图像会有单独的定义)。
如果库使用标准图形管道,则图像可以存储在用作管道线输入的纹理中,也可以存储在用作管道线输出的 PBuffer 中 - 两个独立的物理(或逻辑?-取决于特定的硬件实现)位置。
要从一种内存类型传输到另一种内存类型,转换是不够的,您需要读取缓冲区并将其写入不同的分配位置。
框架的实现可以对两者使用相同的基类,但是,实现可能不兼容。
您拥有的不是可编译的 C# 代码。这是 Obj-C 绑定定义。然后,btouch 命令行实用工具会生成真正的 C# 代码,并编译到可以引用的库中。在您的示例中,已编译程序集中的类定义为
public class GPUImageView : UIView
{
}
和
public class GPUImageOutput : NSObject
{
}
它们实际上都不是从GPUImageInput继承的,它们都不是真正的接口。您可以阅读本指南以获取更多信息。