使用继承实现接口(子类)

时间:2014-05-08 14:06:20

标签: c# php oop

我试图实现类似下面的类图的系统 我想定义一个接口,一个实现接口部分的基类,以及实现接口其余部分的子类。 有没有办法可以做到这一点?我在C#中尝试了这个,但编译器抱怨基类没有完全实现接口。 如果可能的话,我想要一个适用于C#和PHP的解决方案

enter image description here

2 个答案:

答案 0 :(得分:5)

在C#和PHP中都可以使用的解决方案是同时创建基类和未在其中实现的方法abstract。这是PHP版本:

interface IStep
{
    public function name();
    public function log();
    public function run();
    public function undo();
}

abstract class BaseStep implements IStep
{
    public function name() {}
    public function log() {}
    abstract public function run();
    abstract public function undo();
}

特别是在PHP中,您还可以选择使用trait而不是基类。在这种情况下,这似乎不是一个好的设计,但它可以派上用场:

trait BaseStep
{
    public function name() {}
    public function log() {}
}

class StepOne implements IStep
{
    use BaseStep;

    public function run() {}
    public function undo() {}
}

答案 1 :(得分:0)

问题在于iStep签订合同要求您实施其所有方法和字段,但BaseStep未实施run()undo()

可能的解决方案是使BaseStep成为一个抽象类,或者实现这些方法(甚至使用空白体),或者仅在子类中实现接口。