如何在IFScrollClippingItem接口中定义成员实现与泛型ScrollClippingViewer<T>的反向通信
解决方案
你可以通过以下两种常见方案实现需求:
方案1:提取非泛型公共接口(更灵活,优先推荐)
该方案通过把ScrollClippingViewer需要对外开放的能力抽象到非泛型接口中,规避泛型参数匹配问题:
- 先定义非泛型的
IScrollClippingViewer接口,声明所有子控件需要调用的方法、属性:
public interface IScrollClippingViewer { // 示例:子控件需要调用的公共方法/属性,按需扩展 void ScrollToItem(IFScrollClippingItem item); int TotalItemCount { get; } }
- 让原有泛型类实现该非泛型接口:
public class ScrollClippingViewer<T> : IScrollClippingViewer where T : Control, IFScrollClippingItem { // 原有逻辑保持不变,实现IScrollClippingViewer定义的成员即可 public void ScrollToItem(IFScrollClippingItem item) { // 对应业务逻辑实现 } public int TotalItemCount => 你的内部存储列表.Count; }
- 修改
IFScrollClippingItem接口,引用非泛型接口即可:
public interface IFScrollClippingItem { IScrollClippingViewer refScrollClippingViewer { get; set; } void SetScrollClippingViewer(IScrollClippingViewer argRefScrollClippingViewer); }
方案2:使用泛型接口(强类型场景适用)
如果子控件需要拿到强类型的ScrollClippingViewer实例,可将IFScrollClippingItem改为泛型接口:
- 定义泛型版本的接口:
public interface IFScrollClippingItem<T> where T : Control, IFScrollClippingItem<T> { ScrollClippingViewer<T> refScrollClippingViewer { get; set; } void SetScrollClippingViewer(ScrollClippingViewer<T> argRefScrollClippingViewer); }
- 调整泛型类的约束匹配:
public class ScrollClippingViewer<T> where T : Control, IFScrollClippingItem<T> { // 原有逻辑不变,添加子控件时直接给属性赋值即可 public void AddItem(T item) { item.refScrollClippingViewer = this; // 其他添加逻辑 } }
选型建议
- 如果子控件调用的能力不涉及泛型参数
T,优先选择方案1,不需要额外增加泛型约束,适配性更高 - 如果需要强类型的
ScrollClippingViewer实例避免后续类型转换,选择方案2
内容的提问来源于stack exchange,提问作者Michiel
相关产品推荐
相关产品推荐

