使用接口与使用此接口管理对象的通用类型 class 进行通信
Using an interface to communicate back to a Generic Type class that manages objects with this interface
我有一个泛型 class 叫做
public class ScrollClippingViewer<T> where T : Control, IFScrollClippingItem
此 class 将处理同样继承 IFScrollClippingItem
的不同类型的用户控件。它会将 UserControl 存储在一个列表中,并确保它们在 ScrollViewer 中按顺序显示。
我想要的是 UserControl 在界面中有一个 属性 或方法,可以创建与 ScrollClippingViewer 通信的可能性;我的问题出现了,因为 ScrollClippingViewer 是一个通用类型 class,我不知道如何把它放在界面中:
public interface IFScrollClippingItem
{
// This does not work
ScrollClippingViewer<T> refScrollClippingViewer { get; set; }
// This neither
void SetScrollClippingViewer(ScrollClippingViewer<T> argRefScrollClippingViewer);
}
您可以在界面中使用模板化方法,如下所示:
public interface IFScrollClippingItem
{
void SetScrollClippingViewer<T>(ScrollClippingViewer<T> argRefScrollClippingViewer) where T: Control, IFScrollClippingItem;
}
但这似乎不是个好主意,因为模板类型T
与接口没有联系,所以在实现接口时你会这样写:
public class SampleControl: Control, IFScrollClippingItem
{
public void SetScrollClippingViewer<T>(ScrollClippingViewer<T> argRefScrollClippingViewer) where T: Control, IFScrollClippingItem
{
...
}
}
在此方法中,您将能够使用已传递的 argRefScrollClippingViewer
,但您将无法将其保存到键入的 属性,只要不能属性 类型 ScrollClippingViewer<T>
。
我建议你引入一些接口:IScrollClippingViewer
,它将由 ScrollClippingViewer
实现,并将为 IFScrollClippingItem
个实例提供所需的功能。
例如:
public interface IScrollClippingViewer
{
...
}
public class ScrollClippingViewer<T>: IScrollClippingViewer where T: Control, IFScrollClippingItem
{
...
}
public interface IFScrollClippingItem
{
IScrollClippingViewer Viewer { get; set; }
}
我有一个泛型 class 叫做
public class ScrollClippingViewer<T> where T : Control, IFScrollClippingItem
此 class 将处理同样继承 IFScrollClippingItem
的不同类型的用户控件。它会将 UserControl 存储在一个列表中,并确保它们在 ScrollViewer 中按顺序显示。
我想要的是 UserControl 在界面中有一个 属性 或方法,可以创建与 ScrollClippingViewer 通信的可能性;我的问题出现了,因为 ScrollClippingViewer 是一个通用类型 class,我不知道如何把它放在界面中:
public interface IFScrollClippingItem
{
// This does not work
ScrollClippingViewer<T> refScrollClippingViewer { get; set; }
// This neither
void SetScrollClippingViewer(ScrollClippingViewer<T> argRefScrollClippingViewer);
}
您可以在界面中使用模板化方法,如下所示:
public interface IFScrollClippingItem
{
void SetScrollClippingViewer<T>(ScrollClippingViewer<T> argRefScrollClippingViewer) where T: Control, IFScrollClippingItem;
}
但这似乎不是个好主意,因为模板类型T
与接口没有联系,所以在实现接口时你会这样写:
public class SampleControl: Control, IFScrollClippingItem
{
public void SetScrollClippingViewer<T>(ScrollClippingViewer<T> argRefScrollClippingViewer) where T: Control, IFScrollClippingItem
{
...
}
}
在此方法中,您将能够使用已传递的 argRefScrollClippingViewer
,但您将无法将其保存到键入的 属性,只要不能属性 类型 ScrollClippingViewer<T>
。
我建议你引入一些接口:IScrollClippingViewer
,它将由 ScrollClippingViewer
实现,并将为 IFScrollClippingItem
个实例提供所需的功能。
例如:
public interface IScrollClippingViewer
{
...
}
public class ScrollClippingViewer<T>: IScrollClippingViewer where T: Control, IFScrollClippingItem
{
...
}
public interface IFScrollClippingItem
{
IScrollClippingViewer Viewer { get; set; }
}