抽象基类还是接口?似乎都不对

Mat*_*ley 4 .net c# inheritance interface abstract

给出以下代码:

using System.Collections.Generic;
static class Program {
    static void Main() {
        bar Bar = new bar();
        baz Baz = new baz();
        System.Console.WriteLine(
            "We have {0} bars, rejoice!", bar.Cache.Count);
    }
}

public abstract class foo {
    public static List<foo> Cache = new List<foo>(); 
}

public class bar : foo {
    public bar() { Cache.Add(this); }
}
public class baz : foo {
    public baz() { Cache.Add(this); }
}
Run Code Online (Sandbox Code Playgroud)

你得到(有点预期)输出"我们有2个酒吧,欢喜!".

这真是太棒了,我们现在拥有啤酒的两倍(显然),但我真正想要的是每个类都拥有它自己的缓存.我不想在子类中实现此缓存的原因是因为我的抽象类中还有一些方法需要能够在缓存上操作(即迭代所有这些方法).有没有办法做到这一点?我已经看过使用接口foo,但接口不允许将静态成员定义为接口的一部分.

Rex*_*x M 8

foo的每个派生类都应该定义获取缓存的方式/位置,因此每个都可以(可能)拥有自己的缓存.foo中的方法可以引用GetCache()而不知道实现.

public abstract class foo
{
    public abstract ICache GetCache();

    public void DoSomethingToCache()
    {
        ICache cache = this.GetCache();
        cache.DoSomething();
    }
}

public class bar : foo
{
    public static ICache BarCache = new FooCache();

    public override ICache GetCache()
    {
        return bar.BarCache;
    }
}

public class FooCache : ICache { }
Run Code Online (Sandbox Code Playgroud)