gpt4 book ai didi

Java oop 继承和接口(interface)

转载 作者:行者123 更新时间:2023-12-01 22:18:53 25 4
gpt4 key购买 nike

我有几个与java中的oop相关的问题。

我理解is-a关系意味着继承。

我知道可以做关系意味着我需要实现接口(interface)。

这里出现问题:

factory pattern

现在,如果我有更多变量,例如:

在 Square 类中 -> int side;在 Rectangle 类中 -> int width , int height...等等。

如果我按照建议的良好做法进行操作,即创建一个接口(interface)实例

Shape s = new Square();

那么我无法访问实例变量side

所以,我不得不依赖这样的东西:

Square s = new Square();
s.side = 3;
s.draw();
  1. 那么,我的设计不正确吗?
  2. 实现接口(interface)的类是否应该只具有接口(interface)所具有的方法,而没有其他用于调用目的的方法?

在继承的情况下也会出现同样的问题。例如:

public class Animal{
}

public class Reptile extends Animal{
}

public class Dog extends Animal{
}

现在,如果我尝试这样的事情:

狗有自己的变量,如 dentry 、腿和眼睛。

Animal a = new Dog();
a.teeth = 30; // will not work

或者

按照这样的做法正确吗:

Dog d  = new Dog();
d.teeth = 30;

那么,我缺少一些设计细节吗?请解释一下。

我尽力做出正确的设计。只是偶然发现了这些东西。

最佳答案

我没有发现与您的设计相关的继承和多态性有任何问题。 (除非我想说正方形、圆形、矩形都是形状,所以也许可以使用继承来代替)。不过,您可能缺少一些有关 Java 语法的内容。

考虑任何声明:

A test = new B()

第一个关键字,A ,告诉计算机变量的类型是什么。在这种情况下,您向计算机保证您的变量引用的任何内容都将是 A 。第二个关键字test , 只是变量的名称。第三部分,= new B()告诉计算机您正在分配 test引用 B 类型的新对象。只要BA ,你很好。

现在让我们考虑第一个示例,其中 SquareShape 。如果你说

Shape s = new Square()

您正在告诉计算机 s引用 Shape - 即“无论 s 所指的始终是 Shape 。当您设置它 = new Square() 时,您是在说您希望它引用 Square 。这很好,因为 Square < em>是一个 Shape 。但是,你不能说 s.side = 3 因为 s 你只能保证计算机 s 引用 Shape 而不是所有 Shape 都刚刚1 边长。

出于矛盾考虑,假设您应该能够访问 s.side。那么如何协调这两个代码块呢?

Square s = new Square();
s.side = 3;
System.out.println( s.side );

Shape s = new Square();
s.side = 3;
s = new Circle();
System.out.println( s.side );

显然是Circle没有一方会“规避”我们的逻辑。

另一方面,如果你说

Square s = new Square();

你保证电脑无论如何s指的是会有一个side属性(property),因此您可以访问 s.side .

补充:具体回答您的问题“那么,我缺少一些设计细节?”

我认为您没有遗漏设计细节。我认为您只是不太明白代码的含义。例如,有些情况你想说

Animal a = new Dog();

有些情况你想说

Dog a = new Dog();

在确定您要使用的类型标识符(动物或狗)时,您会问自己一个问题:“我是在动物还是狗上进行操作?”如果你对动物进行手术,你会说

Animal a = new Animal();

然后,您可以进行更复杂的操作。例如,如果您有一个动物列表,并且所有动物都有一个方法 live() ,然后您可以浏览列表并将所有动物设为 live()不必担心它是狗、猫还是 Camel 。代码:

ArrayList< Animal > listOfAnimals = new ArrayList< Animal >();
//populate the list
for ( Animal a : listOfAnimals ) {
a.live();
}

如果您只对狗进行手术(例如,您需要它们全部咬人),那么您必须使用Dog标识符。代码:

ArrayList< Dog > listOfDogs = new ArrayList< Dog >();
//populate the list
for ( Dog d : listOfDogs ) {
d.bite();
}

如果我们声明 ArrayList< Animal > listOfDogs = new ArrayList< Animal >(); 会出现什么问题并制作了每个元素bite()

关于Java oop 继承和接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30371769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com