【问题标题】:Can abstraction be achieved using concrete classes?可以使用具体类来实现抽象吗?
【发布时间】:2018-12-16 18:10:13
【问题描述】:

我已经尽力找到这个问题的最佳答案,但徒劳无功。
所以,我在一次采访中被问到这个问题,我的回答是肯定的。由于抽象只是简单地向用户隐藏实现细节,这样用户就不必担心实现,只知道方法签名(需要传递的对象类型和返回类型)。根据传递的对象类型,开发人员可以决定实现并返回相应的结果。 所以,根据我的说法,这也可以使用如下具体的普通类来完成。

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");
    }
}

我知道这不是实现抽象的正确方法,必须使用接口或抽象类来完成。但是,问题是是否可以使用具体类来实现抽象(让我们把适当的方法放在一边)。那么,这个问题的答案是否正确?

【问题讨论】:

  • 面试问题很少是是/否事务。面试官会在某种解释之后解释为什么你可以或不能使用具体类来实现抽象。因此,正如您所证明的那样,尽管在技术上是正确的,但简单地说“是”是错误的答案。
  • @DawoodibnKareem 所以这意味着“是”以及解释和示例?
  • 我认为SpeakingAnimal::getAnimalToSpeak() 没有执行抽象操作。很明显,它的工作就是强迫动物说话。因此,摘要部分为Animal::speak()。我同意达伍德的观点,即面试是你论证你的观点以说服你的面试官的时候。大多数时候没有对错。嗯编辑:你需要辩论,而不是争论。不要与面试官争论。
  • 嗯嗯嗯嗯,是的。
  • 如果没有对抽象的含义进行一点澄清,我不会马上回答这个问题。当然,您展示了一个实现抽象层的示例,但如果您更直接地理解它,特别是如果它更多地是一个语言问题,可能不会那么多。

标签: java oop interface abstract-class abstraction


【解决方案1】:

抽象类不能产生实例;你可以通过声明一个私有构造函数来确保它不会。

这是一个例子:

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");
        }
    }
}

【讨论】:

  • 虽然您所说的某些内容在技术上是正确的,但在我看来,这在很大程度上被误解了。抽象类是声明为abstract 的类,然后您不需要构造函数来防止实例化。私有构造函数确保类和具体子类的实例只能在类内部实例化,这是完全不同的。因此,对于您的示例类,永远无法创建老虎或马。你似乎也没有回答这个问题?
猜你喜欢
  • 2010-09-21
  • 2012-02-25
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-13
  • 1970-01-01
相关资源
最近更新 更多