C#中丑陋的继承
本文关键字:继承 | 更新日期: 2023-09-27 18:12:25
我有
public class ViewBaseBase : UserControl
然后我有
public class ViewBase<TPresenter, TIView> : ViewBaseBase
这当然会导致
public class AView : ViewBase<ConcretePresenter, IView>
理由是,我想要一种非通用的方式来访问ViewBase,而不知道TPresenter,TIView。
这对任何人来说都是"错误的"吗?我不知道,它起作用了,似乎没有给我带来问题,但在某种程度上感觉"不对"。可能是ViewBaseBase的名称,我可能会使用接口,但实际上我很喜欢在该级别继承UserControl,因为所有ViewBase都必须是UserControl。。。
如果你想以多态的方式访问这些东西,除非你有一个非泛型的绝对基类,否则你无能为力。您还说过每个ViewBase
都必须是UserControl,但这并不意味着您不能使用接口。考虑一下:
public interface IViewBase
{
}
public abstract class ViewBase<IPresneter, TIView> : UserControl
, IViewBase
{
}
public class AView : ViewBase<ConcretePresenter, IView>
{
}
AView现在是UserControl
和IViewBase
。我个人认为这更干净。
public class ViewBaseBase : UserControl
如果任何ViewBaseBase必须是UserControl,那么这比接口更可取,因为它强制执行了这一点。如果ViewBaseBase提供的是代码,而不仅仅是签名(一切都是抽象的(,那么这是在没有一些真正繁重的卷积的情况下完成任务的唯一可能方法,因为C#不提供多重继承。如果ViewBaseBase只提供签名(所有内容都是抽象的(,并且某个东西可能是ViewBaseBase而不是UserControl(即使不在您的项目中(,那么我会考虑接口。
同样的逻辑出现在层次结构的后续级别。
在整体层次结构上,它在任何情况下都会妨碍你吗?如果是这样,那么以这样或那样的方式重构可能是值得的,但如果不是这样,我甚至不会停下来思考。毕竟,类层次结构的目的是让开发人员的生活更轻松,所以它是否这样做是最终的问题。