C# WindowsForms 对泛型方法等感到困惑。
主要目标是通过接口访问对象的方法。
说明:该对象必须具有一个 VIEW 方法,该方法能够将不同的“类”作为参数。
我试图做的事情:我在 IAppObject 接口中声明了一个方法void View<T>(T Model) where T : class
。看起来应该是这样,但是将来我需要在这个接口的继承者中实现几个VIEW方法,这取决于传递的是哪个类<T>
。那些。例如,如果我传递 MyClassA,那么 View 方法应该做一件事,如果我传递 MyClassB,那么 View 方法应该做另一件事。通常这是通过方法重载实现的,但是接口应用于必须有 View 方法的不同类,而不是每个类都必须接受 MyClassA,所以你不能在接口中重载方法——这会在接口中创建一堆不必要的实现继承人。我试图通过在后继者中做到这一点where T: MyClassA
,但它需要像在界面中那样具体实现条件。
接口示例:
public interface IAppObject : IDisposable
{
/// <summary>
/// Просмотр видимой части объекта "по умолчанию".
/// </summary>
void View();
/// <summary>
/// Просмотр видимой части объекта в зависимости от переданной модели.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="Model"></param>
void View<T>(T Model) where T : class;
/// <summary>
/// Событие - уничтожение текущего объекта.
/// </summary>
event EventHandler EventRemoveObject;
}
类中实现的View方法的一个例子:
/// <summary>
/// Показать визуальную часть от модели.
/// </summary>
void IAppObject.View<T>(T Model)
{
UserSessionModel us = Model as UserSessionModel;
this.View(us);
}
/// <summary>
/// Показать визуальную часть от модели.
/// </summary>
public void View<T>(T Model) where T : UserSessionModel
{
}
从接口继承者中的 View 方法的实现示例可以看出,为了调用重载方法,您需要确定传递的参数 T 的类型 - 即 创建一堆 if、swith 和其他废话。将发誓缺乏对 UserSessionModel 的显式转换。
问题:如何在接口(Interface)中描述一个方法(可能是通用的),而在继承者中的实现却可以通过重载方法来执行?PS:我不想使用类继承(简单/抽象),我对通过接口感兴趣。
通过反射解决方案(不是我想要的,但是......):
界面:
必须对所有模型使用 1 个通用类以“集中”通用方法中的约束条件。
使用反射实现类中泛型方法的“重载”(这个术语不正确,但作用相似):
调用示例:
同时UserSessionModel类强制继承AModel,以满足泛型方法中T参数的限制条件: