Java 是否可以使用空方法作为";“半抽象”;方法?(菲律宾)

Java 是否可以使用空方法作为";“半抽象”;方法?(菲律宾),java,php,oop,Java,Php,Oop,参见货币类: abstract class Money { private $value; public abstract function getName(); public function show() { static::announceOutput(); return 'output: '.$this->value.' ('.$this->getName().')'); } publi

参见货币类:

abstract class Money
{
    private $value;

    public abstract function getName();

    public function show()
    {
         static::announceOutput();
         return 'output: '.$this->value.' ('.$this->getName().')');
    }

    public function announceOutput() { }
}
以及一些实现

class Dollar extends Money
{
    public function getName()
    {
        return '$';
    }
}

class Huf extends Money
{
    public function getName()
    {
        return 'HUF';
    }
}

class Font extends Money
{
    public function getName()
    {
        return 'L';
    }

    public function announceOutput()
    {
        return 'Font is outputted, its name is miswritten';
    }
}
我知道这不是一个栩栩如生的例子。我想展示的是:

  • getName()
    在每个值中都是不同的,因此它必须是抽象的,并且 覆盖100%
  • show()
    如果每个值都是这样的话
  • announceOutput()
    有趣的部分来了。贵重物品可能 决定是否覆盖它,这样它就不必是抽象的。 然而,如果是这样的话,每个班级都会有成吨的空课 announceOutput()方法。所以它就像一个半抽象类,但是 不太可能被覆盖

我的问题是,这是我做了一些不好的事情的迹象?

这不是你做错了什么的迹象。这里发生的事情是,抽象类为一个方法提供了基本的行为,同时仍然允许它的任何子类用自己的实现推翻这个默认行为

您可能会被抛弃,因为示例中
announceOutput()
方法的默认行为没有主体,这使它看起来很奇怪。如果里面有实际的代码,看起来会非常正常


然而,正如在评论中提到的,您也可以通过一个接口来解决这个问题。这是否会更好取决于环境。在您的示例中,这似乎是完全可行的。

在这种情况下,您应该使用接口而不是抽象类来定义“子对象”必须使用指定的签名实现指定的方法

interface MoneyName
{
    public function getName();
}

abstract class Money
{
    private $value;

    public function show()
    {
         static::announceOutput();
         return 'output: '.$this->value.' ('.$this->getName().')');
    }

    public function announceOutput() { }
}

class Dollar extends Money implements MoneyName
{
    public function getName()
    {
        return '$';
    }
}

您还可以实现多个接口

在这种情况下,您应该使用接口而不是抽象类来定义“子级”必须实现具有指定签名的指定方法