C#不支持多重继承,那么我怎样才能使它工作?

我创建了两个具有不同目的的DataGridViews,我想将它们组合在一起.我之前没有意识到你不能从多个基类继承.

我查看了各种其他Stack Overflow问题,并找到了推荐界面或组合解决方案的人们的共同主题.我试图将这些概念应用到我的情况,但它们似乎不太合适.

首先,这是我希望的结构……

RowSelectionDataGridView – DataGridView,用于选择整行,并具有轻松设置颜色样式等选项

DragAndDropDataGridView – RowSelectionDataGridView,允许用户单击行拖动到另一行的顶部,并将行移动到删除的位置

ContextMenuDataGridView – RowSelectionDataGridView,显示右键单击行上方的ContextMenuStrip,用于复制,粘贴,删除等操作

CombinedDataGridView(非实际名称)= DragAndDropDataGridView和ContextMenuDataGridView,允许用户拖放,右键单击也有上下文菜单条

                                        DataGridView                          
                                             ▲                                
                                             |                                
                                             |                                
                                  RowSelectionDatatGridView                   
                                             ▲                                
                                             |                                                                
                        _____________________|_____________________           
                       |                                           |          
                       |                                           |          
             DragAndDropDataGridView                   ContextMenuDataGridView
                       ▲                                           ▲          
                       |                                           |          
                       |___________________________________________|          
                                             |                                
                                             |                                
                                             |                                
                                    CombinedDataGridView                      

如果我要实施……

接口:
我的理解是ContextMenuDataGridView和DragAndDropDataGridView需要成为接口,然后CombinedDataGridView将继承这两者.我没有看到这一点,因为所有的逻辑都必须在CombinedDataGridView中实现.这会带来什么好处?或者我对此有何误解?

组合:我的理解是CombinedDataGridView将在其中包含DragAndDropDataGridView和ContextMenuDataGridView的实例.这似乎对此没有任何意义.

如何构建我的类以获得所需的功能?

最佳答案 TL; DR:
Honey don’t

1.多重继承(MI)

继承基于“A”是“B”的概念,但有一些添加或更改.

这很常见.

然而,MI将这个想法扩展为’A’既是’B’又是’C’在概念上遇到许多问题,尤其是.当两个“父母”要么太不同(例如:既是“车辆”又是“食物”),或者当它们太相似时……后者引入问题的一个原因是“冲突”,即字段(或方法) )父母双方都有..;现在,它将用于’A’:’B.field1’或’C.field1’?如果没有排位赛,这会让人感到困惑.

当A. Hejlsberg开始设计C#时,他不仅设计了从Pascal到Turbo Pascal以及非常成功的Delphi框架的扩展.他还实现了Microsoft的Java编译器.所以他知道MI将带来的问题并决定MI真正提供的好处(多重多态性和可重用性)都可以通过接口实现.

2.接口

接口不是对象,也不包含任何代码或任何数据.这是一份合同,承诺任何使用此接口装饰的类都将提供一组特定功能.

理解和理解这个概念的最好方法是研究.Net框架.看看IComparable.它是以各种特殊方式对所有类型的事物进行排序的基础,只要它们是IComparable(并且,我认为IEnumerable);然而所有这些排序都可以依赖于特定的比较方法.这允许您实现一次通用功能并一次又一次地重复使用.

一个经常使用的例子是关于形状.使用继承来构建包含圆形,三角形,矩形,正方形的继承链或树将导致各种冲突.但添加IDrawable接口是很自然的,例如,您可以在List< IDrawable&gt中收集它们;然后你可以枚举.. 另一个例子是ISerializable,它还提供(或者更确切地说是)以专门方式实现的一般服务.

你的情况

我很遗憾地说,但你的情况最好通过放弃整个想法来“解决”.

这不仅是有问题的,因为父母都是视觉控制,这使得MI冲突特别可能.实际上两者都是一样的,即两者都是DataWindows!这是一场MI噩梦,因为每一场都会发生冲突!

4.如何解决它

>最自然的方法是放弃整个MI方法并像框架本身那样做:在继承链中尽快引入一个特性,因为它是有意义的.除了这个功能,我们还推出了’bool CanDoOrHasFeature’属性,一切都很好.

最可怕的例子是DataGridView具有的所有’AllowUserToXYZ’属性..

不要害怕这会使程序膨胀:类定义只加载一次! (当然,如果你想提供逻辑,那么无论如何都必须编写/加载代码.)

>另一种选择是辅助类;您可以编写一个ReorderElements类,并让这些控件注册到您要为其提供此功能的控件.我有一个ControlMover类,让我想让可移动的控件订阅它的服务..

点赞