“创建新类的标准是什么?是否应该为任何不同的实例创建一个新类?”

时间:2014-05-11 13:38:14

标签: java oop

我有以下代码:

public class Toy {
    static protected int d = 1;;
    protected int id;
    protected double price;
    protected int minAge;
    protected int maxAge;
    protected String size;
    protected String name;

    public Toy(double price, int minAge, int maxAge, String size) {
        this.id = d++;
        this.price = price;
        this.maxAge = maxAge;
        this.minAge = minAge;
        this.size = size;
        String s = this.getClass().getName();
        this.name = size + "_" + s.substring(s.lastIndexOf('.') + 1) + "_" + id;
    }

    public double getPrice() {
        return price;
    }

    public int getId() {
        return id;
    }

    public String getSize() {
        return size;
    }

    public int getMinAge() {
        return minAge;
    }

    public int getMaxAge() {
        return maxAge;
    }

    public String getName() {
        return name;
    }

    public boolean check(double price, int minAge, int maxAge, String size) {
        if (this.price <= price && this.minAge <= minAge
                && this.maxAge >= maxAge && size.equals(this.size))
            return true;
        return false;
    }

    public String ToString() {
        return name + "_" + minAge + "-" + maxAge;
    }
} 

和一些子类,其中之一:

public class Ball extends Toy {

    public Ball(double price, int minAge, int maxAge, String size) {
        super(price, minAge, maxAge, size);
    }
}

我认为,这不是创建类的好方法,它没有新的字段/方法/。

如果我是对的,你能给我一个建议吗?  &#34;创建新课程的标准是什么?是否应该有任何不同实例的新类?如果没有任何新的字段/方法,创建子类是否合适?&#34;

4 个答案:

答案 0 :(得分:0)

通常,当新类添加新状态或行为时,会扩展现有类。

Toy对我来说非常通用。它是抽象的,Ball提供了抽象方法的特殊实现吗?

如果没有,您听起来像名为Toy的{​​{1}}实例就足够了。

如果您需要这种状态和方法,我会将该类玩具更加通用,例如ball。没什么玩具的,我能看到。

答案 1 :(得分:0)

我没有看到没有新字段/方法的子类的问题,因为子类添加了一个非常重要的信息:它不仅仅是任何玩具,而是。也许你的代码的另一部分将取决于一个特定的实例是一个球而不是一般玩具的事实。

以后会出现其他行为或字段......

答案 2 :(得分:0)

我们创建类的原因主要不是为了添加更多的方法&#34;。类是对象模型的构建块。作为一种对象。它们有助于区分您(以及您的类的客户和代码的未来维护者)什么是不同类型什么只是一个实例。

对于ToyBall的情况,请考虑一下:是一个球只是The Toy的一个实例,或者你的脑海中是否有类似The Ball的内容? 您是否有其他类的方法,您只想接受球?

如果你现在没有看到球的任何额外方法或属性,那也没关系。他们可能会来晚些,或者他们不必迟到。这没关系。什么问题,如果在你的 模特球是特别的。

不要过度使用继承,但不要将其视为向类添加方法或成员的工具。这将是对这一概念的完全基本的误解。

请注意遵循Liskov Substitution Principle。在一个非常简短的总结中,一旦你决定使用inhteritance,尝试设计你的类层次结构,以避免实例化&#34;中间类&#34; (它仍然有后代 - 它们不属于层次结构的尾部)。这会在以后引起您的问题,另请参阅着名的Square-Rectangle Problem&#34;。

有一个名为marker interface的近亲概念。您可能会注意到,即使在标准Java API中,也有许多没有任何方法的接口。它们为对象添加了额外的信息,可以在以后使用。

答案 3 :(得分:-1)

如果您不需要为“Ball”添加更多字段方法,我认为这是最好的方法:

Toy ball = new Toy(price,minaAge,maxAge,size);

你正在使用强大的武器作为nobrainer的继承,就像使用军队杀死蚊子一样