【问题标题】:Object Oriented Polymorphism Logic in Java [closed]Java中的面向对象多态逻辑[关闭]
【发布时间】:2021-03-06 19:52:49
【问题描述】:

我们可以在两种实现中对 cat 和 dog 对象使用同名的 getWeight() 方法。我找不到两个实现之间的任何区别。在这里使用多态或覆盖有什么好处吗?

首次实施

public class Cat{ 
    public int getWeight() { return 5; }
}

public class Dog {
    public int getWeight() { return 7; }
}

public class Main {

    public static void main(String [] args) {

        Dog dog = new Dog();
        Cat cat = new Cat();

        System.out.println(dog.getWeight());
        System.out.println(cat.getWeight());
    }
}

第二次实施

public class Cat extends Animal{
    public int getWeight() { return 5; }
}

public class Dog extends Animal{
    public int getWeight() { return 7; }
}

public class Animal {   
    public int getWeight() return 10;
}

public class Main {
  
    public static void main(String [] args) {
        Animal dog = new Dog();
        Animal cat = new Cat();

        System.out.println(dog.getWeight());
        System.out.println(cat.getWeight());
    }
}

【问题讨论】:

  • 我只会在 Animal 中有一个 setWeight() 类和实例变量,而在子类中没有它。
  • 投票关闭“需要更多关注”。以一种或另一种方式做这件事可能有好处,但我们不能从你的简短讨论中说出来。一般来说,没有偏好。
  • 这取决于CatDog 实例需要做什么。例如,尝试使用每个实现创建一个包含Cats 和Dogs 的列表。
  • 标记问题:OP 需要解释代码的用途。需要更多关于正在构建的内容的背景才能给出答案。

标签: java oop polymorphism


【解决方案1】:

如果 Cat/Dog 是 Animal 的子类型,则 Cat/Dog 类型的对象可以替换为 Animal 类型的对象(即,类型 T 的对象可以替换为子类型 S 的任何对象)而不改变任何程序的理想属性(正确性、执行的任务等)

这有助于遵守 LSP https://en.wikipedia.org/wiki/Liskov_substitution_principle

遵循 LSP 的代码彼此松散依赖,并鼓励代码可重用性。不遵守 LSP 的代码是紧密耦合的,会产生不必要的纠缠。在给定的情况下,如果客户不想沉迷于每种动物类型,他们可以简单地使用 Animal 变量类型。因此,使它们与实际的实现子类型解耦,从而能够使用相同的代码支持任何动物的实现。

但是,在某些情况下,坚持 LSP 也会导致问题。例如:http://www.blackwasp.co.uk/squarerectangle.aspx

覆盖的另一个优点是新的实现会更容易且更标准化。新的动物类型实施者将知道在实施过程中要注意哪些行为。

【讨论】:

    【解决方案2】:

    如果不了解更多关于您的程序的信息,就很难以一种或另一种方式说出来。这个方法会是这些类之间唯一的共同属性吗?是否需要以通用方式处理 Animals ?您将来添加更多 Animal 子类的可能性有多大?

    【讨论】:

    • 请在cmets部分分享cmets
    • 我还没有评论的声誉。抱歉,我对 StackOverflow 有点陌生。
    • 我想问一下我们以后可以根据需要添加新的动物亚型。使用哪种方式会更好?我希望系统灵活敏捷。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 2019-05-11
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 2014-11-24
    • 2010-09-11
    相关资源
    最近更新 更多