c# - 抽象基类还是接口(interface)?两者都不对

标签 c# .net 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); }
}

您得到(有些符合预期的)输出“我们有 2 根柱子,高兴!”。

这太棒了,我们现在有两倍多的地方可以喝啤酒(显然),但我真正想要的是每个类(class)都有自己的缓存。我不想只在子类中实现这个缓存的原因是因为我的抽象类中也有一些方法需要能够对缓存进行操作(即迭代所有这些方法)。有没有办法做到这一点?我看过为 foo 使用接口(interface),但该接口(interface)不允许将静态成员定义为接口(interface)的一部分。

最佳答案

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

关于c# - 抽象基类还是接口(interface)?两者都不对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/616743/

相关文章:

c# - 通过 count() 进行左连接和分组的 Linq 查询

c# - 将 hiddenfield-value 用于 asp-route-parameter

c# - 并发队列和栈在.NET 4中的应用

JavaScript 继承未按预期工作

c# - 如何将 3 个字符串数组(包含文件)放入一个数组中

c# - 无法解析类型的符号

c# - 将控制台输出镜像到文件

c# - 读取分隔文件并按日记条目分成组

.NET:继承修改基类(C++转换)

Java方法重载 - 同一继承树中的通用参数和参数