我想声明一些抽象方法(因此在从这个方法继承的类中需要实现)以适应我的情况,即:
我正在制作一个拼图解算器程序。到目前为止,我有3个包:
games.puzzles
games.puzzles.rivercrossing
games.puzzles.rivercrossing.wolfgoatcabbage
我不想过于具体,但在games.puzzles.rivercrossing
包中我有两个代表银行和州的类:GenericBank
和GenericState
。
现在,他们定义了一些行为,但是有一些方法,从这些继承的类必须具有,如move()
将一个元素从一个库移动到另一个库或{ {1}}和isPermitted()
检查状态。
例如,在最后一个包中,我有isFinal()
类,它必须有自己的WolfGoatCabbageGame
和Bank
类,这些类将继承自通用类。这些特定的State
和Bank
类必须实现我上面提到的方法,例如在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
方法(或实现相同的行为)?
答案 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();