【问题标题】:Static Method Shared Among all Implementing Types在所有实现类型之间共享的静态方法
【发布时间】:2011-08-14 08:26:57
【问题描述】:

在 c# 中,如何定义一个由所有派生/实现类型实现的静态方法?我知道你不能在接口中定义静态方法。

基本前提是这样的:

比如说我有一个有机体的基类。 派生类型将是 Human 和 Dog。

我想要一个可以返回给我的方法,告诉我给定生物体的腿数。所以 Human 是 2,dog 是 4,等等。

我可以将这样的方法设为实例方法,但这没有多大意义,因为它对所有 Dog 类型都是相同的方法,对所有 Human 类型都是相同的,等等。

【问题讨论】:

标签: c# interface


【解决方案1】:

我认为你没有完全理解 OO。将其设为实例方法非常有意义。

如果你有 2 条狗(一只叫lucky),lucky 被车撞到失去一条腿会怎样?用你的模型,整个品种的狗都失去了一条腿?

但在更好的模型中:

#psudo 
class Organism{
   public abstract void legs(){ return 0;}
}
class Dog : Organism{
   private int _legs;
   public int legs(){ return _legs; }
}

那么幸运会失去一条腿。


【讨论】:

  • 啊,让我想起了我的 AP 物理课。 Will E. Bounce 正以每秒 2.4 米的速度向北穿过一条两条车道的道路。每条车道宽4米。一辆卡车以每秒 30 米的速度向东移动。如果卡车在 200 米外的远车道上并且没有并道,E. 会反弹吗?
【解决方案2】:

使它成为一个实例方法。使用继承,您的派生类应该实现自己的版本,返回适当的值。

【讨论】:

    【解决方案3】:

    类似的东西。

    abstract class Organism
    {
        public abstract int NumberOfLegs();
    }
    
    abstract class Biped : Organism
    {
        public sealed override int NumberOfLegs()
        {
            return 2;
        }
    }
    
    
    abstract class Quadroped : Organism
    {
        public sealed override int NumberOfLegs()
        {
            return 4;
        }
    }
    
    class Humand : Biped
    {
    
    }
    
    
    
    class Dog : Quadroped
    {
    
    }
    

    但我会担心使用这样的分类法,更担心会在这些假设中进行烘焙。也就是说,静态类型语言的一个好处是,当您确实需要重新审视一个糟糕的假设时,它会迫使您查看依赖于该假设的所有代码......这是一件好事。

    【讨论】:

      猜你喜欢
      • 2021-08-24
      • 2015-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-20
      • 1970-01-01
      • 2020-11-29
      相关资源
      最近更新 更多