c# - 子类可以实现与其父类相同的接口(interface)吗?

标签 c# oop interface implementation

我今天之前从未遇到过这个问题,想知道实现这种行为的约定/最佳实践是什么。

基本设置是这样的:

public interface IDispatch {
    void Dispatch();
}

public class Foo : IDispatch {
    void IDispatch.Dispatch() {
        DoSomething();
    }
}

public class Bar : Foo {
     ...
}

Bar 需要子类化 Foo,因为它与 Bar 共享所有相同的属性,并且引入了 2 个我需要遇到的新属性。我遇到的问题是 Foo 还需要一个稍微不同的 Dispatch() 实现。通常它会被重写,但这对接口(interface)方法无效,所以让 Bar 也实现 IDispatch 是否可以,所以我的类定义如下所示:

public class Bar : Foo, IDispatch { .... }

然后在 Bar 中显式实现该接口(interface)方法?当我尝试这样做时,我的编译器似乎没有提示,但我不确定它是否会导致任何运行时问题来解决在路上使用哪个实现,或者是否有更好的方法来完成这样的事情。

另外值得一提的是,在我的工作场所,我们使用从 UML 模型生成代码,这强制所有类设计必须首先从模型完成。代码生成工具是导致接口(interface)方法被显式实现的原因(不想争论这个的利弊,这正是我现在被迫处理的,所以隐式实现不是一种选择)

最佳答案

或者,您可以通过以下两种方式之一执行此操作:

首先,不要显式实现接口(interface):

public class Foo : IDispatch {
    public virtual void Dispatch() {
        whatever();
    }
}

public class Bar : Foo {
    public override void Dispatch() {
        whateverElse();
    }
}

其次,显式实现它,但添加一个子类可以覆盖的函数:

public class Foo : IDispatch {
    void IDispatch.Dispatch() {
        this.Dispatch();
    }

    protected virtual void Dispatch() {
        whatever();
    }
}

public class Bar : Foo {
    protected override void Dispatch() {
        whateverElse();
    }
}

关于c# - 子类可以实现与其父类相同的接口(interface)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13516264/

相关文章:

Angular 4 : Argument of type 'typeof CLASS' is not assignable to parameter of type 'INTERFACE'

c# - 如何使用 WebRequest 发布数据并从网页获取响应

c# - 哪种技术更适合成为移动开发人员 C# 或 java?

c# - 如何在 C# 中获取枚举索引值

java - 在空接口(interface)上“删除中间人”IntelliJ 重构

java - 标记接口(interface)的内部实现是什么?

c# - 为什么 C# 中的委托(delegate)语法允许 +=,而总是最后一个函数也会被指向

php - PDO PHP MYSQL OOP 建议和操作方法

javascript - 检查 Javascript 命名空间中的类类型是否可用

python - 为什么覆盖我的方法会导致我的属性停止正常工作?