2016-04-10 3 views
0

Я ищу обходное решение для следующей проблемы. Учитывая иерархию классов в Java:Xamarin Android привязка к Java-типу, который наследует общий тип

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 (связанный с # класс) и каким-то образом, чтобы получить к нему доступ через базовый интерфейс (литая ОК).

+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, и написать мою собственную иерархию в дополнениях (частичные классы). Благодаря!! –

Смежные вопросы