首先,下面的问题是我正在编写的Xamarin应用程序,但我认为这是因为C#不是因为底层Java,如果是因为Java那么请告诉我所以我可以更正问题标题
我希望创建一个抽象类,我将使用它作为我的项目将使用的所有Fragment类的基础。所以我这样定义了它:
public abstract class CoreFragment<T> : Fragment
类中的T表示必须由此Fragment附加到的任何类实现的接口,例如我的代码是:
private T _parent;
public override void OnAttach(Activity activity){
if (activity is T){
_parent = activity as T;
} else { throw new Exception("Incorrect type of parent")' }
}
因此,当我创建一个只应附加到实现接口iMainInteractions的类型的新片段时,我将其创建为:
public class MyNewFragment : CoreFragment<iMainInteractions>
我的问题是上面的代码:
_parent = activity as T;
不编译,我甚至尝试过:
_parent = (T) activity;
因为它有时看起来像'as'那样工作,并且它不断抛出一个编译器错误,T没有被指定为特定类型(我假设它希望我在T的位置定义某些东西) :某事)
如果我删除它并使用类似的东西:
_parent = (T) Convert.ChangeType(activity, typeof(T));
它将编译,当时间到来时它将进入语句的真实部分但是当ChangeType尝试执行时,它将抛出一个异常,表示该活动没有实现IConvertible
所以除了创建一个空白的iInteraction接口作为T的父级,并且让我的所有交互接口都遵循这个,有没有办法让这个工作?
提前感谢您提供的任何帮助
答案 0 :(得分:1)
您缺少class
约束:
public abstract class CoreFragment<T> : Fragment where T : class
问题是as
运算符仅适用于引用类型,因此如果转换无效,它可以安全地生成null
。在T
无约束的情况下,编译器无法判断它是否会被引用或值类型替换,因此as
无法对其进行操作。
我不知道您的类层次结构是什么,但我考虑引入一个可用作类型约束的基本接口或类。例如,如果所有类似Activity
的类都必须实现基本接口,例如IActivityBase
:
public abstract class CoreFragment<T> : Fragment where T : IActivityBase
此类界面实际上不需要包含任何成员,并且只能在使用泛型类时提高类型安全性。