使用具体的类可以实现抽象吗?
Can abstraction be achieved using concrete classes?
我已经尽力找到这个问题的答案,但徒劳无功。
所以,我在面试中被问到这个问题,我回答是。由于抽象只是简单地向用户隐藏实现细节,这样用户就不必担心实现而只知道方法签名(需要传递的对象类型和return类型)。根据传递的对象类型,开发人员可以决定实现和 return 相应的结果。
所以,根据我的说法,这也可以使用下面的具体法线 类 来完成。
public class LearnAbstraction {
public static void main(String[] args) {
Animal animal = new Tiger();
SpeakingAnimal sa = new SpeakingAnimal();
sa.getAnimalToSpeak(animal);
}
}
class SpeakingAnimal {
public void getAnimalToSpeak(Animal animal){
animal.speak();
}
}
class Animal{
public void speak(){
System.out.println("I am an Animal");
}
}
class Tiger extends Animal {
public void speak() {
System.out.println("I am an Animal and Tiger");
}
}
class Horse extends Animal {
public void speak() {
System.out.println("I am an Animal and Horse");
}
}
我知道这不是实现抽象的正确方法,必须使用接口或抽象来完成 类。但是,问题是是否可以使用具体的 类 来实现抽象(让我们把适当的方法放在一边)。那么,这个问题的答案是否正确?
抽象class不能产生实例;您可以通过声明私有构造函数来确保它不会。
这是一个例子:
class Animal{
private Animal() {
}
public void speak(){
System.out.println("I am an Animal");
}
static class Tiger extends Animal {
public void speak() {
System.out.println("I am an Animal and Tiger");
}
}
static class Horse extends Animal {
public void speak() {
System.out.println("I am an Animal and Horse");
}
}
}
我已经尽力找到这个问题的答案,但徒劳无功。
所以,我在面试中被问到这个问题,我回答是。由于抽象只是简单地向用户隐藏实现细节,这样用户就不必担心实现而只知道方法签名(需要传递的对象类型和return类型)。根据传递的对象类型,开发人员可以决定实现和 return 相应的结果。
所以,根据我的说法,这也可以使用下面的具体法线 类 来完成。
public class LearnAbstraction {
public static void main(String[] args) {
Animal animal = new Tiger();
SpeakingAnimal sa = new SpeakingAnimal();
sa.getAnimalToSpeak(animal);
}
}
class SpeakingAnimal {
public void getAnimalToSpeak(Animal animal){
animal.speak();
}
}
class Animal{
public void speak(){
System.out.println("I am an Animal");
}
}
class Tiger extends Animal {
public void speak() {
System.out.println("I am an Animal and Tiger");
}
}
class Horse extends Animal {
public void speak() {
System.out.println("I am an Animal and Horse");
}
}
我知道这不是实现抽象的正确方法,必须使用接口或抽象来完成 类。但是,问题是是否可以使用具体的 类 来实现抽象(让我们把适当的方法放在一边)。那么,这个问题的答案是否正确?
抽象class不能产生实例;您可以通过声明私有构造函数来确保它不会。
这是一个例子:
class Animal{
private Animal() {
}
public void speak(){
System.out.println("I am an Animal");
}
static class Tiger extends Animal {
public void speak() {
System.out.println("I am an Animal and Tiger");
}
}
static class Horse extends Animal {
public void speak() {
System.out.println("I am an Animal and Horse");
}
}
}