虚拟功能与静态类?

时间:2015-12-11 16:41:36

标签: c# static-methods virtual-functions

如果我在同一名称空间下定义了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,()=>myfunction())方法时,它会重定向到CacheExtensions类而不是CachManager类,尽管ICacheManager是从它继承的?您能否解释一下如何使用共享覆盖函数?如何相关?

1 个答案:

答案 0 :(得分:1)

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

基本上,扩展只是一个糖,因为没有Action1(Action2(Action3(Action4(obj)))),但扩展将被转换为此。

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

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