2016-04-10 6 views
0

次の問題の回避策を探しています。 Javaでクラス階層を考えると次のように一般的なタイプを継承するJavaタイプへのXamarinのAndroidバインディング

public interface Bar<T> { 
    getValue<T>(); 
} 

public abstract class BarImpl<T> implements Bar<T> { 

} 

public class Foo extends BarImpl<Double> { 
    @override 
    public Double getValue() { 
     // .. 
    } 
} 

Xamarin.Androidは、ラッパーを生成します。

// Now in C# land 
public interface Bar 
{ 
    // Xamarin.Android omits T Value { get; } 
} 

public partial abstract class BarImpl : Bar 
{ 
    // Xamarin.Android omits abstract T Value { get; } 
} 

public partial class Foo : BarImpl 
{ 
    // COMPILE ERROR HERE. No method to override 
    public override java.lang.Double Value 
    { 
     get { /* ... */ } 
    } 
} 

は、今私は、ジェネリック医薬品の情報からJavaコンパイルストリップことはよく承知しているので、これは実際にはありません簡単な問題は解決するが、私はかどうかを知りたいん:

  • 誰でもjava.androidに同様の問題に遭遇した

  • あなたはこのクラス階層をバインドするために巧妙なソリューションを採用しましたか?

私はFooの(バインドC#クラス)とベースのインタフェースを介してそれにアクセスするためのいくつかの方法(キャストはOKです)上の値のゲッターで唯一興味があります。

+0

は部分的に生成されたクラスではありませんか? o0 –

+0

はい、そうですが、Foo.Valueのオーバーライドを最初から削除するにはどうすればよいですか? –

+0

ああ...あなたはノードFoo.Valueを完全に除外し、それを部分クラスで宣言していますか? ... –

答えて

3

ジェネレータは部分クラスを生成します。これらを拡張することが解決策になる可能性があります。あなたがしなければならないのは、Additionsフォルダーにファイルを追加し、あなたのものを部分クラスに広告することです。私の考えは次のようになります:

// custom interface 
public interface IMyBar<T> : Bar<T> 
{ 
    public T Value { get; } 
} 

// extend the partial base class 
public partial abstract class BarImpl : IMyBar<Java.Lang.Double> 
{ 
    public abstract Java.Lang.Double Value { get; } 
} 

// compiler generates the rest 
public partial class Foo 
{ 
    // COMPILE ERROR HERE. No method to override 
    public override Java.Lang.Double Value 
    { 
     get { /* ... */ } 
    } 
} 
+0

私は正確にこのソリューション(私の質問よりも少し複雑な階層のため)を使用していない間、それは私は、Xamarin.Androidによって作成された擬似ノードを削除し、追加情報(部分クラス)で自分の階層構造を作成するというソリューションを教えてくれました。ありがとう!! –

関連する問題