c# - 我怎样才能在c#中拥有一种虚拟静态成员

标签 c# virtual overloading static-members

我有一个类:

public class Food
{
  public static IList<Ingredient> ingredients
  public bool uses(Ingredient i)
  {
    return ingredients.Contains(i);
  }
}

然后我继承它来制作各种食物,例如:

public class Cake : public Food
{
  public static IList<Ingredient> ingredients = new List<Ingredient>()
  {
    Sugar,
    Eggs,
    Milk
  }
}

现在我希望能够做到

Food f = getFood();
if (f.uses(Eggs))
{
   // Do something
}

因此,我想要一个(例如)所有蛋糕都可以共享的静态成分列表,而不是每个 Cake 实例的列表,并且能够以虚拟方式访问它。

如果需要的话,我愿意修改代码以获得类似的效果!

最佳答案

在这种情况下,OOD“更喜欢”将 Food 类抽象化,因为 Food 的“成分”会有所不同。因此,正如其他人指出的那样,使此列表静态是没有意义的,因为静态应该是不通过对象区分的属性的修饰符。

我建议的解决方案如下:

public abstract class Food
{
   public abstract IList<Ingredient> Ingredients
   {
       get;
   }
}

现在,任何类(作为具体的类)都将由 Food 驱动,因此它必须实现此属性,以便提供自己的成分:

public class Cake : Food
{
  public override IList<Ingredient> Ingredients
  {
      get { 
              return new IList<Ingredient>()
              { Sugar, Eggs, Milk };
          }
  }
}

关于c# - 我怎样才能在c#中拥有一种虚拟静态成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7704879/

相关文章:

c# - 如何在 C# 中将空 session 值默认为空白字符串

c# - 恢复另一个应用程序的最小化窗口

c# - .NET Framework 2.0 中的 AES 256 加密

c++ - C++中的非虚拟指针?

c++ - 常量方法重载

c++ - 将类对象转换为字符串

c# - Java "equivalent"到 CSLA

c++ - 声明所有虚拟方法以使用 gtest 进行模拟?

c++ - 编译器是否优化了对虚方法的非多态调用?

python - 如何正确重载 __add__ 方法?