みなさん、良い一日を、
インターフェイスと、それらが相互に拡張/継承する方法について質問があります。この質問は、GPU プログラミングとはほとんど関係がありません。
質問:
GPUImageView と GPUImageInput の 2 つのインターフェイスがあります。
GPUImageView は次のように定義されています。interface GPUImageView : GPUImageInput { /*some code*/ }
私は機能を持っています:void AddTarget(GPUImageInput newTarget) {/*some code*/}
GPUImageView のインスタンスを AddTarget に渡すと、GPUImageView を GPUImageInput に変換できないというエラーが表示されます。
追加情報:
Monotouch の GPUImage ライブラリを btouch にバインドしようとしています。私は彼らの例の 1 つ (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.GPUImageInput」を入力する引数 GPUImage.GPUImageOutput' 式 (CS1503) (ImageProcessingLab)
ImageProcessingLabViewController.cs(32,32): エラー CS1503: 引数#1' cannot convert
GPUImage.GPUImageView' 式は、'GPUImage.GPUImageInput' を入力します (CS1503) (ImageProcessingLab)
しかし、ご覧のとおり、GPUImageFilter は GPUImageInput を継承/実装/拡張しているため、GPUImageSketchFilter、GPUImageOutput、および GPUImageView を GPUImageInput として使用/キャストできるはずです。
明確化: GPUImageInput を期待する AddTarget を呼び出そうとすると、エラーが発生します。GPUImageOutput から継承し、GPUImageInput を実装する GPUImageFilter を指定しています。GPUImageFilter は GPUImageInput にキャストできるはずですが、代わりにエラーが発生します。
どんな答えにも感謝します。何か不足していますか?ありがとうございました!