【发布时间】:2012-06-03 07:13:22
【问题描述】:
大家好,
我有一个关于接口以及它们如何相互扩展/继承的问题。这个问题与 GPU 编程无关。
问题:
我有两个接口:GPUImageView 和 GPUImageInput。
GPUImageView 定义:interface GPUImageView : GPUImageInput { /*some code*/ }
我有一个函数:void AddTarget(GPUImageInput newTarget) {/*some code*/}
当我将 GPUImageView 的实例传递给 AddTarget 时,我得到一个错误,它无法将 GPUImageView 转换为 GPUImageInput。
其他信息:
我正在尝试将 Monotouch 中的 GPUImage 库与 btouch 绑定。我尝试移植他们的一个示例(SimplePhotoFilter)作为测试。
这导致了
- 我放入 ViewDidLoad 方法的演示代码。
- APIDefinitions.cs 我填充了必要的绑定。
- StructsAndEnums.cs 暂时为空。
这是 APIDefinitions.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: 参数 #1' cannot convertGPUImage.GPUImageOutput' 表达式键入 `GPUImage.GPUImageInput' (CS1503) (ImageProcessingLab)
ImageProcessingLabViewController.cs(32,32):错误 CS1503:参数 #1' cannot convertGPUImage.GPUImageView' 表达式输入“GPUImage.GPUImageInput” (CS1503) (ImageProcessingLab)
但正如您所见,GPUImageFilter 继承/实现/扩展 GPUImageInput,这应该允许我使用/转换 GPUImageSketchFilter、GPUImageOutput 和 GPUImageView 作为 GPUImageInput。
澄清:当我尝试调用需要 GPUImageInput 的 AddTarget 时发生错误。我给它一个 GPUImageFilter,它继承自 GPUImageOutput 并实现 GPUImageInput。 GPUImageFilter 应该可以转换为 GPUImageInput,但会导致错误。
感谢任何答案。 我错过了什么吗? 谢谢!
【问题讨论】:
-
是的。 Xamarin 的 Monotouch 是适用于 iPhone 的 C# 和 .net。
-
要明确,
GPUImageOutput是一个类,GPUImageInput是一个 Objective-C 协议。-addTarget:需要一个符合GPUImageInput协议的通用 (id) 类型。GPUImageView是符合GPUImageInput协议的 UIView 子类。
标签: c# inheritance interface xamarin.ios