【问题标题】:How to force abstract class childs to implement a static method? [duplicate]如何强制抽象类子实现静态方法? [复制]
【发布时间】:2012-11-14 01:25:22
【问题描述】:

可能重复:
How can I force inheriting classes to implement a static method in C#?

我理解抽象和静态是相反的,但我想强制派生类实现静态方法。我该怎么做?

在 SimonC 之后编辑: 在尝试描述我想要做的事情时,我意识到超类的静态方法将无法调用被覆盖的子类版本。

但 olivier 的替代解决方案看起来不错。

【问题讨论】:

  • 简而言之,你不能。为什么要这样做?
  • 这里的一个用例是有一个静态的“CreateDefault”方法,它返回父类的一个对象,但每个子类都会覆盖它。现在我明白它实际上没有意义,因为为了使用它,您仍然需要使用子的静态上下文调用 CreateDefault,这违背了使用继承的目的。在我看来,这里寻求的真正优势是编译器时间检查子类是否实现了静态方法。
  • 同样,这并没有太大帮助,因为它不会强制您的静态方法在任何地方使用。我认为奥利维尔答案中的单身想法确实是最好的。我同意@SimonC 的观点,即开发人员应该退后一步,通过尝试在父类中使用静态方法并在子类中覆盖来弄清楚他们真正想要完成的工作。

标签: c# oop


【解决方案1】:

将静态行为与继承或接口实现相结合的一种可能方法是使用单例模式。对单例对象的访问是静态的,但该对象是使用 new 创建的,就像“普通”对象一样

public interface ISomeInterface { ... }

public class SomeClass : ISomeInterface
{ 
    public static readonly SomeClass Instance = new SomeClass();

    private SomeClass()
    { 
    }

    // TODO: Implement ISomeInterface
    // and/or override members from a base class.
}

访问单例的方法

ISomeInterface obj = SomeClass.Instance; // Static access to interface.
var y = obj.SomeMethod(x);

【讨论】:

  • 对于更复杂的方案,您可以查找工厂方法/类设计模式,以及可能的惰性实例化。
【解决方案2】:

你不能。静态方法不受多态行为的影响。你甚至不能自愿重写静态方法,更不用说强制一个类重写它们了。

【讨论】:

    【解决方案3】:

    对不起,这是不可能的。抽象类和/或基类都是关于对象继承的。

    static 方法特定于一个且只有一个类,并且是不可可继承的。

    【讨论】:

    • 这在一般的 OOP 中是不正确的。似乎只与 c# 更相关。如果我有一个辅助函数在父类中删除一些字符串值,并且所有子类都使用相同的函数,为什么我不能在父类中保持静态?
    猜你喜欢
    • 2013-08-02
    • 1970-01-01
    • 2011-03-25
    • 2015-06-09
    • 1970-01-01
    • 2019-04-15
    • 2010-12-18
    • 2017-09-29
    相关资源
    最近更新 更多