【问题标题】:Can not resolve symbol, abstract class factory无法解析符号,抽象类工厂
【发布时间】:2014-01-03 03:43:22
【问题描述】:

我是 Java 新手,我正在关注通过示例进行测试驱动开发。在第 8 章中,我们将 franc 和 dollar 严格划分为 Money。我已经像这样为法郎和美元创建了工厂方法,但是当我尝试运行测试时,我得到“无法解析符号美元”(或法郎)的测试行:

Money five= new Money.dollar(5);
Money four= new Money.franc(5);

我已经从头开始了两次,并尝试用谷歌搜索它,但我不确定我错过了什么。

金钱类:

public abstract class Money {

    abstract Money times(int multiplier);

    protected int amount;

    static Money dollar(int amount){
        return new Dollar(amount);
    }

    static Money franc(int amount){
        return new Franc(amount);
    }

    public boolean equals(Object object){
        Money money = (Money) object;
        return amount == money.amount
        && getClass().equals(money.getClass());
    }

}

法郎(美元也一样):

public class Franc extends Money {


    Franc(int amount){
        this.amount = amount;
    }

    Money times(int multiplier){
        return new Franc(amount * multiplier);
    }

}

测试:

import org.junit.Test;

import static org.junit.Assert.*;

public class MoneyTest {
    @org.junit.Test
    public void testMultplication(){
        Money five= new Money.dollar(5);
        assertEquals(new Dollar(10), five.times(2));
        assertEquals(new Dollar(15), five.times(3));
        Money four= new Money.franc(5);
        assertEquals(new Franc(10), four.times(2));
        assertEquals(new Franc(15), four.times(3));
    }

}

【问题讨论】:

    标签: java


    【解决方案1】:
    Money five= new Money.dollar(5);
    

    语法错误。将其更改为:

    Money five= Money.dollar(5);
    

    因为new 关键字用于创建实例,但您想改为调用静态方法。抽象类也不能被实例化。

    【讨论】:

    • 我就知道会是这样!非常感谢。
    【解决方案2】:

    您正在使用工厂模式;你根本不需要使用new 关键字。

    改为使用工厂:

    Money five= Money.dollar(5);
    Money four= Money.franc(5);
    

    我还鼓励您对对象进行具体化;一个是Dollar,另一个是Franc;你应该使用那些实例而不是更抽象的Money。如果您的子类更明显不同(例如,如果 Franc 有一种方法可以指示它在哪些国家/地区被接受),那么不这样做会影响您。

    【讨论】:

    • 谢谢!我记得读过有关构造函数和抽象类的文章,但现在应该坚持下去了。
    • @Makoto - Amy IS 使用 DollarFranc 的实例 - 看看她的代码!
    • @DavidWallace:不过,看看它们存储在什么中。假设Franc 有一个方法可以打印出它相对于美元的价值。如果它仅特定于该子方法,您将如何调用它?
    • 如果他立即阅读,我确实有一个错字已修正。 Makoto 真的很快。
    • @Amy - 你的书不太可能给你和 Makoto 一样的建议。查看stackoverflow.com/questions/1484445/… 了解原因。
    猜你喜欢
    • 2011-01-05
    • 2014-01-14
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多