我见过this,但我想知道是否有可能强制覆盖未标记为虚拟或抽象类型的成员(因此不应该破坏基础对象的功能)。
我特别指的是覆盖:
IDictionary<TKey, TValue> Dictionary { get; }
in
KeyedCollection<TKey, TValue>
使用另一个实现IDictionary的成员类型,以使用另一个内部存储集合。
是否有可能绕过限制?
请注意,我不想为此使用扩展(在我的情况下,无论如何都不会有用)。
答案 0 :(得分:5)
否 - .net必须将方法标记为显式虚拟或抽象以覆盖它。
编辑:鉴于对问题的编辑,听起来你需要创建一个实现IDictionary<TKey, TValue>
的自定义类(我认为KeyedCollection会这样做),然后添加另一个允许你通过{{获取对象的索引器1}}。索引器看起来像这样:
TKey
如果需要,您可以通过委派私有TValue this[TKey key] { get { ... } }
字段来支持几乎所有IDictionary方法和属性,对于那些您希望以不同方式实现的方法,您可以自由地执行此操作。完整的课程对于答案来说太长了,否则我会发布它。
这适用于良好的开发实践Prefer Composition over Inheritance
答案 1 :(得分:3)
如果.NET就像c ++一样,这在物理上是不可能的,因为虚拟实现为函数指针,非虚函数实现为固定函数地址。
所以,不。
即使你插入反射或指针或其他东西,你也没有放置新函数指针的PLACE,因为虚拟/抽象保留它。
也许最好能看到反汇编的代码 - 看看如何调用虚拟代码并与非虚拟代码的调用方式进行比较。
答案 2 :(得分:0)
正如其他答案所说,你不能在派生类中覆盖,但你可以隐藏基础实现:
static void Main(string[] args)
{
Console.WriteLine("Animal: {0}", new Animal().NumberOfLegs);
Console.WriteLine("Caterpillar: {0}", new Caterpillar().NumberOfLegs);
Console.ReadKey();
}
public class Animal
{
public int NumberOfLegs { get { return 1; } }
}
public class Caterpillar : Animal
{
public new int NumberOfLegs { get { return 100; } }
}