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

本文关键字:记为 虚拟 成员 抽象的 重写 可以使 派生 类型 是否 | 更新日期: 2023-09-27 18:08:51

我已经看到了这一点,但是我想知道是否有可能用派生类型强制覆盖未标记为虚拟或抽象的成员(因此不应该破坏基对象功能)。

我特别指的是重写:

IDictionary<TKey, TValue> Dictionary { get; }

KeyedCollection<TKey, TValue> 

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

有可能绕过这个限制吗?

请注意,我不想为此使用扩展(在我的情况下,它不会有任何帮助)。

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

不能——在。net中,一个方法必须被显式地标记为虚拟或抽象才能覆盖它。

编辑:考虑到对问题的编辑,听起来你需要创建一个实现IDictionary<TKey, TValue>的自定义类(我认为KeyedCollection做),然后添加另一个索引器,允许你通过TKey获得对象。索引器看起来像这样:

TValue this[TKey key] { get { ... } }

如果你愿意,你可以通过委托给一个私有的KeyedCollection<TKey, TValue>字段来支持几乎所有的字典方法和属性,对于那些你想要实现不同的,你可以自由地这样做。整个课程太长了,不能回答,否则我就把它贴出来了。

这符合良好的开发实践

如果。net在这方面像c++,那在物理上是不可能的,因为虚值是作为指向函数的指针实现的,而非虚值是作为固定的函数地址实现的。

,

即使你使用了反射或者指针或者其他什么,你也没有一个地方可以放置新的函数指针,因为虚/抽象会保留它。

也许你最好看看反汇编代码——看看虚函数是如何被调用的,并比较一下非虚函数是如何被调用的。

正如其他答案所说,您不能在派生类中重写,但您可以隐藏基实现:

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