如何在非抽象类中声明抽象方法

时间:2016-02-01 15:10:35

标签: java oop inheritance

我想声明一些抽象方法(因此在从这个方法继承的类中需要实现)以适应我的情况,即:

我正在制作一个拼图解算器程序。到目前为止,我有3个包:

  • games.puzzles
  • games.puzzles.rivercrossing
  • games.puzzles.rivercrossing.wolfgoatcabbage

我不想过于具体,但在games.puzzles.rivercrossing包中我有两个代表银行和州的类:GenericBankGenericState

现在,他们定义了一些行为,但是有一些方法,从这些继承的类必须具有,如move()将一个元素从一个库移动到另一个库或{ {1}}和isPermitted()检查状态。

例如,在最后一个包中,我有isFinal()类,它必须有自己的WolfGoatCabbageGameBank类,这些类将继承自通用类。这些特定的StateBank类必须实现我上面提到的方法,例如在Wolf,Goat和Cabbage游戏中,检查山羊和狼是否不在同一个银行等。

所以最初我将泛型类声明为State,并且这些方法也要实现abstract

abstract

看起来它似乎工作,直到我发现我必须实例化public abstract class GenericBank { // more members ... public abstract boolean move(Element element, GenericBank dst); // more members... } public abstract class GenericState { // more members... public abstract boolean isPermitted(GenericBank bank); public abstract boolean isFinal(GenericBank bank); // more members... } GenericBank个对象,如果这些类是抽象的,当然不能这样做。

所以我不得不从类中删除GenericState限定符。

那么......我该怎么办?如何在非abstract类中声明abstract方法(或实现相同的行为)?

6 个答案:

答案 0 :(得分:5)

  

如何在非抽象类中声明抽象方法?

答案:你不能。它是 abstract的定义。这就是你无法将对象实例化为抽象类的原因。

或者:

A)您需要使用接口

B)在父类中将方法保留为空:

//technically this needs to return a value, but it doesn't need to *do* anything
public boolean isPermitted(GenericBank bank){ return false; }

C)重构您的代码,以便您不实例化抽象对象。我无法建议如何执行此操作,因为您没有提供任何相关的代码。

答案 1 :(得分:1)

您可以使用不执行任何操作的空方法替换抽象方法,并返回其各自返回类型的默认值(如果需要,使其成为泛型类契约的一部分,则子类必须覆盖这些方法)。

或者,您可以在Null object pattern之后保留抽象的Generic* - 类并添加Null* - 类与上述空实现。

答案 2 :(得分:0)

您不能在非抽象类(最终点)中声明abstract个方法。

这将简单地玷污abstract方法的概念。

>做的是让您的类层次结构实现接口,指示实现所需的方法。

如果您发现以前的abstract类实际上更好地设计为具体类,请将它们转换为具体类并实现这些方法,即使使用默认的常规实现也是如此。

然后,您可以微调子类中的覆盖。

答案 3 :(得分:0)

你不能,抽象类的定义是它有抽象方法。

您可以做的是定义默认行为,可以被子类否决。

但是,在执行此操作之前,我会仔细考虑您的类层次结构。事实上,您需要在实际实现之前实例化某些类,这表明您的设计可能需要重新思考。

如果您要重新设计,您将需要查看实例化的时间 - 以及实例化的原因。 现在,您希望在知道该类的实际实例之前使用某些类的常见行为。

它有点超出了回答问题的范围,但是:考虑向朋友解释代码的设计。或rubber duck。这可能有助于您找到一种新方法。

答案 4 :(得分:0)

删除抽象限定符并添加一个空体,或者抛出一些运行时异常。

或者将这些泛型类实例化为匿名子类

答案 5 :(得分:0)

您可以改用虚拟

internal class ClassA
{
    public void Print()
    {
        Console.WriteLine("A");
        PrintVirtual();
        Console.WriteLine("--------------------------------------------------");
    }
    protected virtual void PrintVirtual()
    {
        Console.WriteLine("Virtual");
    }
}

internal class ClassB : ClassA
{
    protected override void PrintVirtual()
    {
        Console.WriteLine("B");
    }
}

internal class ClassC : ClassA
{
    protected override void PrintVirtual()
    {
        Console.WriteLine("C");
        base.PrintVirtual();
    }
}

您可以运行测试

new ClassA().Print();
new ClassB().Print();
new ClassC().Print();