使用另一个接口扩展接口

时间:2012-06-03 07:13:22

标签: c# inheritance interface xamarin.ios

大家好日子,

我对接口以及它们如何相互扩展/继承有疑问。这个问题与GPU编程没什么关系。

问题:

我有两个接口:GPUImageView和GPUImageInput。

定义了GPUImageView:interface GPUImageView : GPUImageInput { /*some code*/ }

我有一个功能:void AddTarget(GPUImageInput newTarget) {/*some code*/}

当我将一个GPUImageView实例传入AddTarget时,我得到一个错误,它无法将GPUImageView转换为GPUImageInput。

其他信息:

我正在尝试使用btouch绑定Monotouch中的GPUImage库。我试图将他们的一个例子(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 convert GPUImage.GPUImageOutput'表达式,用于键入`GPUImage.GPUImageInput'(CS1503)(ImageProcessingLab)

ImageProcessingLabViewController.cs(32,32):错误CS1503:参数#1' cannot convert GPUImage.GPUImageView'表达式,用于键入`GPUImage.GPUImageInput'(CS1503)(ImageProcessingLab)

但正如您所看到的,GPUImageFilter继承/ implements / extends GPUImageInput,这应该允许我使用/ cast GPUImageSketchFilter,GPUImageOutput和GPUImageView作为GPUImageInput。

澄清:当我尝试调用期望GPUImageInput的AddTarget时发生错误。我给它一个GPUImageFilter,它继承自GPUImageOutput并实现GPUImageInput。 GPUImageFilter应该可以转换为GPUImageInput,但会导致错误。

感谢任何回答。 我错过了什么吗? 谢谢!

2 个答案:

答案 0 :(得分:0)

我不熟悉该特定框架,但实施的硬件选项有限。

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

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

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

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

答案 1 :(得分:0)

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

public class GPUImageView : UIView
{
}

public class GPUImageOutput : NSObject
{
}

它们都没有从GPUImageInput继承,它们都不是真正的接口。您可以阅读此guide以获取更多信息。