是否可以使用派生类型强制覆盖未标记为虚拟或抽象的成员?

时间:2011-09-14 23:33:38

标签: c# .net oop inheritance override

我见过this,但我想知道是否有可能强制覆盖未标记为虚拟或抽象类型的成员(因此不应该破坏基础对象的功能)。

我特别指的是覆盖:

IDictionary<TKey, TValue> Dictionary { get; }

in

KeyedCollection<TKey, TValue> 

使用另一个实现IDictionary的成员类型,以使用另一个内部存储集合。

是否有可能绕过限制?

请注意,我不想为此使用扩展(在我的情况下,无论如何都不会有用)。

3 个答案:

答案 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; } }
}