开发者社区> 问答> 正文

关于抽象类的一个小问题

abstract class 猫科{
abstract void 叫();
}
class 猫 extends 猫科{
void 叫(){
System.out.println("喵");
}
}
class 老虎 extends 猫科{
void 叫(){
System.out.println("嚎");
}
}
为什么多此一举的去定义一个抽象类呢?
class 猫{
void 叫(){
System.out.println("喵");
}
}
class 老虎{
void 叫(){
System.out.println("嚎");
}
}
直接这样不好吗?

展开
收起
蛮大人123 2016-02-27 14:38:29 2260 0
2 条回答
写回答
取消 提交回答
  • 猫科动物是要表达猫科动物都有的特征,比如都会叫,都有尾巴;
    具体的猫、老虎的叫声和尾巴可以不一样;
    谈论猫科动物时,我们直接说猫科动物会叫就好类,如果没有抽象类,没法表达这种

    2019-07-17 18:48:51
    赞同 展开评论 打赏
  • 我说我不帅他们就打我,还说我虚伪

    首先来个高端的概念, 前者我们通常称之为设计模式之策略模式;
    说下这种模式对应的场景:
    假如现在你某个类想调用猫和老虎的叫方法, 怎么办? 用你后面的定义方式:

    class 别管我叫什么 {
        static void call(猫 cat) {
            cat.叫();
        }
    
        static void call(老虎 tiger) {
            tiger.叫();
        }
    }
    
    别管我叫什么.call(new 猫());
    别管我叫什么.call(new 老虎());

    哎呀, 同样的代码, 我要写两遍诶! 现在是代码量小, 我还可以不怕麻烦人肉写. 如果代码很大的? 不但写起来费力气, 维护起来也恶心人啊!
    好了, 现在由策略模式来解放你!

    class 别管我叫什么 {
        static void call(猫科 cat) {
            cat.叫();
        }
    }
    别管我叫什么.call(new 猫());
    别管我叫什么.call(new 老虎());

    有么有很简单! 写起来好省心的说! 后面维护这段代码的人都会在心里默默的感谢你!

    2019-07-17 18:48:51
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载