【问题标题】:Extending an interface with another interface用另一个接口扩展一个接口
【发布时间】: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


【解决方案1】:

我不熟悉那个特定的框架,但是,用于实现的硬件选项有限。

如果库对图像使用 GPGPU(例如 CUDA)缓冲区,则输入和输出图像不会有单独的定义(也许基于纹理内存的快速访问只读图像会有单独的定义)。

如果库使用标准图形管道,则图像可以存储在用作管道输入的纹理中,也可以存储在 PBuffer 中,用作管道的输出 - 两个独立的物理(或逻辑? - 取决于具体的硬件实现)位置。

要从一种内存类型转移到另一种内存类型是不够的,您需要读取缓冲区并将其写入不同的分配位置。

框架的实现可能对两者使用相同的基类,但是实现可能不兼容。

【讨论】:

    【解决方案2】:

    您所拥有的不是可编译的 C# 代码。这是 Obj-C 绑定定义。然后,btouch 命令行实用程序会生成真正的 C# 代码并编译到您可以引用的库中。在您的示例中,已编译程序集中的类定义为

    public class GPUImageView : UIView
    {
    }
    

    public class GPUImageOutput : NSObject
    {
    }
    

    它们实际上都不是从 GPUImageInput 继承的,它们都不是真正的接口。您可以阅读此guide 了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-13
      • 2018-07-16
      • 2016-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多