多态在开发中的作用

Posted xlwu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多态在开发中的作用相关的知识,希望对你有一定的参考价值。

1 多态在开发中有什么作用?
    非常重要:五颗星......
    多态在开发中的作用是:
        降低程序的耦合度,提高程序的扩展力。
        
        public class Master{
            public void feed(Dog d){}
            public void feed(Cat c){}
        }
        
        以上的代码中表示:Master和Dog以及Cat的关系很紧密(耦合度高)。导致扩展力很差
        
        public class Master{
            public void feed(Pet pet){}
        }
        
    以上的发表中表示,Master和Dog以及Cat的关系就脱离了,Master关注的是Pet类。
    这样Master和Dog以及Cat的耦合度就降低了,提高了软件的扩展性。
    
    面相对象的三大特征:
        封装、继承、多态
        
        真的是一环扣一环。
        
        有了封装,有了这种整体的概念之后。
        对象和对象之间产生了继承。
        有了继承之后,才有了方法的覆盖和多态。
        
        这里提到了一个软件开发原则:
            七大原则最基本的原则:OCP(对扩展开放,对修改关闭)
            目的是:降低程序耦合度,提高程序扩展力。
            面相抽象编程,不建议面相具体编程。
 
 
 
案例:
宠物的父类:
// 所有宠物的父类
public class Pet{
    // 吃的行为(这个方法可以不给具体的实现)    
    public void eat(){
        
    }
}

 

子类猫类:
// 创建猫类
public class Cat extends Pet{
    // 吃的实例方法
    public void eat(){
        System.out.println("猫咪喜欢吃鱼,吃的很香!");
    }
}

 

子类狗类:
// 宠物狗狗类
public class Dog extends Pet{
    //
    public void eat(){
        System.out.println("狗狗喜欢啃骨头,吃的很香。");
    }
}

 

子类鹦鹉类:
// OCP : 对扩展开发,对修改关闭
public class YingWu extends Pet{
    public void eat(){
        System.out.println("鹦鹉再吃鹦鹉屎,吃的很香!");
    }
}

 

主人类:
// 主人类
public class Master{
    // 假设主任起初的时候只是喜欢养宠物狗狗
    // 喂养宠物狗狗 实例方法
    /*
    public void feed(Dog d){
        d.eat();
    }
    
    // 由于新的需求产生,导致我们“不得不”去修改Master这个类的代码
    public void feed(Cat c){
        c.eat();
    }
    */
    
    // 能不能让Master主人这个类以后不再修改了
    // 即使主人又喜欢养其他动物了,Master也不需要改。
    // 这个时候就需要使用:多态机制。
    // 最好不要写具体的宠物类型,这样会影响程序的扩展性。
    public void feed(Pet pet){
        // 编译的时候,编译器发现pet是Pet类,会去找Pet类中找eat()方法,结果找到了,编译通过。
        // 运行的时候,底层实际的对象是什么,就自动调用到该实际对象对应的eat()方法上。
        // 这就是多态的使用。
        pet.eat();
    }
}

/*

    注意这里的分析:

        主人起初的时候只喜欢养宠物狗狗

        随着时间的推移,主人又喜欢上养“猫咪”

        在实际的开发中这就表示客户产生了新的需求。

        作为软件的开发人员来说,必须满足客户的需求

        我们怎么回去满足客户的需求呢?

            再不使用多台机智的前提下,目前我们只能在Master类中添加一个新的方法。

            

        思考:软件在扩展新需求的过程当中,修改Mater这个类有什么问题?

            一定要记住:软件在扩展过程当中,修改的越少越好。

            修改的乐队,你的系统当前的稳定性就越差,未知的风险就越多。

            2010年开发了农行的内部系统......

            2020年农行内部系统需要升级

            

            其实这里涉及到一个软件的开发原则:

                软件开发原则有七大原则(不属于java,这个开发原则属于整个软件业):

                    其中有一条最基本的原则:OCP(开闭原则)

                    

                什么是开闭原则?

                    对扩展开放(你可以额外的添加,没问题),对修改关闭(最好很少的修改现有程序)。

                    在软件的扩展过程当中,修改的越少越好。

                    

            高手开发项目不是仅仅为了实现客户的需求,还需要考虑软件的扩展性。

            

            什么是软件扩展性?

                假设电脑中的内存部件坏了,我们可以买一个新的插上,直接使用。

                这个电脑的设计就考虑了“扩展性”。内存条的扩展性很好。

                

            面相父类型变成,面相更加抽象进行变成,不建议面相具体变成。

            因为里面相具体变成会让软件的扩展力很差。

*/

 

测试类:
/*
    测试多态在开发中的作用
*/
public class Test{
    public static void main(String[] args){
        // 创建主人对象
        Master zhangsan = new Master();
        // 创建狗狗对象
        Dog zangAo = new Dog();
        // 主人喂
        zhangsan.feed(zangAo);
        // 创建宠物对象
        // 主人喂
        Cat jinJianCeng = new Cat();
        zhangsan.feed(jinJianCeng);
        
        YingWu yw = new YingWu();
        zhangsan.feed(yw);
    }
}

 

案例2:

乐器类 父类:
// 定义乐器类 父类
public class Instrument{
    // 父类中的实例方法
    public void makeSound(){}
}

 

子类 二胡类:
// 子类 乐器二胡 继承父类乐器类
public class Erhu extends Instrument{
    // 重写父类中的乐器方法
    public void makeSound(){
        System.out.println("一曲肝肠断,天涯何处觅知音。");    
    }
}

 

子类 钢琴类:
// 子类钢琴 继承父类乐器类
public class Piano extends Instrument{
    // 重写父类中的乐器方法
    public void makeSound(){
        System.out.println("他的手指像蝴蝶一样在钢琴上偏偏起舞!");    
    }
}

 

子类小提琴类:
// 子类小提琴  继承父类乐器类
public class Violin extends Instrument{
    // 重写父类中的方法
    public void makeSound(){
        System.out.println("他站着,拉着他手中的小提琴,真是一幅优美的画面。");
    }
}

 

乐手类:
public class Musician{
    public void play(Instrument i){
        i.makeSound();
    }
    
    // 第一种写法
    /*
    // 创建一个实例变量
    Instrument i;
    
    // 构造方法
    public Musician(){}
    public Musician(Instrument i){
        this.i = i;
    }
    
    // 创建演奏乐器的方法
    public void play(){
        i.makeSound();
    }*/
}

 

测试类:
// 测试类
public class Test02{
    public static void main(String[] args){
        
        // 第一种写法
        // 创建乐手对象
        /*
        Musician lZ = new Musician(new Erhu());
        lZ.play();
        */
        
        //第二种写法
        Musician lZ = new Musician();
        
        /*
        // 创建二胡对象
        Erhu e = new Erhu();
        
        // 创建小提琴对象
        Violin v = new Violin();
        
        // 创建钢琴对象
        Piano p = new Piano();
        */
        
        /*
        // 创建二胡对象
        Instrument e = new Erhu();
        
        // 创建小提琴对象
        Instrument v = new Violin();
        
        // 创建钢琴对象
        Instrument p = new Piano();
        
        // 让乐手去拉二胡  你需要让乐手演奏什么,就把什么对象传给演奏者进行呀演奏。
        lZ.play(e);
        // 让乐手去拉小提琴
        lZ.play(v);
        // 让乐手去弹钢琴
        lZ.play(p);
        */
        
        lZ.play(new Erhu());
        // 让乐手去拉小提琴
        lZ.play(new Violin());
        // 让乐手去弹钢琴
        lZ.play(new Piano());
    }
}

以上是关于多态在开发中的作用的主要内容,如果未能解决你的问题,请参考以下文章

多态性在 Java 中的方法参数中不起作用

Recyclerview 滚动在嵌套滚动视图中的片段中不起作用

多态性和动态铸造

多态的好处??

片段 getActivity 不起作用

onRequestPermissionsResult 在片段中不起作用