【问题标题】:Virtual function with static class?带有静态类的虚函数?
【发布时间】:2015-12-11 16:41:36
【问题描述】:

如果我在同一个命名空间下定义 2 个不同类中的 2 个函数,如下所示

namespace Cache
{ 
    /// <summary>
    /// Cache manager interface
    /// </summary>
    public interface ICacheManager
    {
        T Get<T>(string key);
    }
}

namespace  Cache
{
    class CacheManager : ICacheManager
    {
        public virtual T Get<T>(string key)
        {
            return (T)Cache[key];
        }
    }
}

namespace Cache
{
    public static class CacheExtensions
    {
        public static T Get<T>(this ICacheManager cacheManager, string key, Func<T> acquire)
        {
            return Get(cacheManager, key, 60, acquire);
        }
    }
}

如果我创建一个实例

ICacheManager _cacheManager;

当我使用类似参数调用_cacheManager.Get(key,()=&gt;myfunction()) 方法时,它会重定向到CacheExtensions 类而不是CachManager 类,尽管ICacheManager 是从它继承而来的?您能否解释一下它是如何使用 shared 覆盖函数的?这有什么关系?

【问题讨论】:

  • “这是什么意思?” - 堆栈溢出。
  • 已编辑。谢谢
  • 我还是说-“堆栈溢出”。
  • 您的ICacheManager 实例上实际上有两个函数Get&lt;T&gt;(string)Get&lt;T&gt;(string, Func&lt;T&gt;)。当您致电 _cacheManager.Get(key,()=&gt;myfunction()) 时,只有第二个匹配。这里没有歧义,你在问什么?
  • 这段代码是递归的——你从不调用实例方法,只调用静态方法。你到底想达到什么目的?

标签: c# static-methods virtual-functions


【解决方案1】:

基本上,扩展方法不是函数覆盖。 更准确地说 - 覆盖适用于虚拟(抽象)功能。在你的情况下 - 它更接近于重载。

基本上,扩展只是一个糖,因为没有Action1(Action2(Action3(Action4(obj)))),但是扩展会被翻译成这个。

https://msdn.microsoft.com/en-us//library/bb383977.aspx

如果您需要从扩展调用实例方法 - 使用在 'this' 关键字下传递的引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多