因此,作为我的程序的公共API的一部分,我公开了类D,这样用户就可以从类D继承来创建自己的类。然而,D类是致命钻石的尖端,我遇到了一个问题,用户的类正在调用类A的默认构造函数,而不是所需的参数化构造函数。AB C DE or F
在下面的代码中,E类是一个干净的API,但是调用错误的A构造函数。类F按预期工作,但是用户必须添加A的参数化构造函数,这很难看,因
我是否应该在GetObjectData中显式地将C#方法变为虚拟的?在“CLR In C#”一书中,我看到了以下摘录:
如果派生类型中没有任何附加字段,因此没有特殊的序列化/反序列化需求,那么您根本不需要实现ISerializable。与所有接口成员一样,GetObjectData 是虚拟,将被调用以正确序列化对象。此外,格式化程序将特殊构造函数视为“虚拟化”。也就是说,在反序列化期间,格式化程序将检查它
当我试图用一种常见的方式--使用虚拟继承--来“解决”通常的钻石问题时,出现了一个奇怪的问题: / \* both virtual \ /然而,我的基类A没有默认构造函数然而,当我试图将一个类E添加到这个菱形中作为C继承时 / \* both virtual \ / \仍然需要在E构造函数中手动调用A的构造函数,即C不需要从E创建或者有没有可能根本不去尝试解决钻石问题:| | no virtual at a