为什么使用抽象类,什么时候使用抽象类

假设有2个类,一个类是主力球员,一个类是替补球员。

    public class NormalPlayer
    {
        public int ID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public decimal WeekSalary { get; set; }

        public string GetFullName()
        {
            return this.FirstName + " " + this.LastName;
        }

        public decimal GetDaySalary()
        {
            return WeekSalary/7;
        }
    }

    public class SubPlayer
    {
        public int ID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public decimal MonthSalary { get; set; }

        public string GetFullName()
        {
            return this.FirstName + " " + this.LastName;
        }

        public decimal GetWeekSalary()
        {
            return MonthSalary/4;
        }
    }

我们发现,NormalPlayer和SubPlayer有共同的属性和方法,当然也有不同的属性和方法。把2个类的共同部分抽象出一个基类。

    public class BasePlayer
    {
        public int ID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }


        public string GetFullName()
        {
            return this.FirstName + " " + this.LastName;
        }
    }

然后让先前的2个类派生于这个基类。

    public class NormalPlayer: BasePlayer
    {
        public decimal WeekSalary { get; set; }

        public decimal GetDaySalary()
        {
            return WeekSalary/7;
        }
    }

    public class SubPlayer : BasePlayer
    {

        public decimal MonthSalary { get; set; }
        public decimal GetWeekSalary()
        {
            return MonthSalary/4;
        }
    }

接着,我们发现NormalPlayer和SubPlayer计算日薪和周薪的方法也可以抽象出来,作为虚方法放到基类中。

    public class BasePlayer
    {
        public int ID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }

        public string GetFullName()
        {
            return this.FirstName + " " + this.LastName;
        }

        public virtual decimal GetSalary()
        {
            throw new NotImplementedException();
        }
    }

在NormalPlayer和SubPlayer这2个派生类中,需要重写基类的虚方法。

    public class NormalPlayer: BasePlayer
    {
        public decimal WeekSalary { get; set; }

        //获取日薪
        public override decimal GetSalary()
        {
            return WeekSalary / 7;
        }
    }

    public class SubPlayer : BasePlayer
    {

        public decimal MonthSalary { get; set; }

        //获取周薪
        public override decimal GetSalary()
        {
            return MonthSalary / 4;
        }

    }

但在实际情况中,BasePlayer只是一个抽象出来的类,我们并不希望实例化这个类。这时候,就可以把BasePlayer设计为abstract抽象类。同时,在抽象类中,提供一个计算薪水的抽象方法。一旦在基类中声明了没有方法体的抽象方法,所有派生于这个抽象类的类必须实现或重写基类中的抽象方法。

    public abstract class BasePlayer
    {
        public int ID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }

        public string GetFullName()
        {
            return this.FirstName + " " + this.LastName;
        }

        public abstract decimal GetSalary();
    }

由此可见,当2个或多个类中有重复部分的时候,我们可以抽象出来一个基类,如果希望这个基类不能被实例化,就可以把这个基类设计成抽象类。

为什么使用抽象类,什么时候使用抽象类,布布扣,bubuko.com

时间: 2024-10-13 14:31:16

为什么使用抽象类,什么时候使用抽象类的相关文章

廖雪峰Java2面向对象编程-4抽象类和接口-1抽象类

每个子类都可以覆写父类的方法 如果父类的方法没有实际意义,能否去掉方法的执行语句?子类会报编译错误 如果去掉父类的方法,就失去了多态的特性 可以把父类的方法声明为抽象方法. 如果一个class定义了方法,但没有具体执行代码,这个方法就是抽象方法: 抽象方法用abstract修饰 抽象方法没有任何执行语句 因为无法执行抽象方法,因此这个类也必须声明为抽象类abstract class 无法实例化一个抽象类.如果子类不是抽象类,依旧可以被实例化. 抽象类作用: 抽象类用于被继承 抽象类可以强迫子类实

PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结

  前  言  OOP  学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1  PHP中的抽象类与抽象方法 1.什么是抽象方法?              没有方法体 {} 的方法,必须使用abstract 关键字修饰.这样的方,我们叫做抽象方法.                    abstract function say(); //    抽象方法 2.什么是抽象类?        

一个接口能否继承另一个接口?一个抽象类能否实现一个接口?

都可以: 一.一个接口能否继承另一个接口? 接口继承接口  本质就是一个抽象类继承另一个抽象类(它们都没写方法的实例).当一个类继承了一个抽象类,它必须要重写父类 抽象类中的抽象方法,如果不去重写父类抽象方法的实例,那么这个类也是抽象类(这个抽象子类,直到重写这个抽象方法的实例为止, 才能摆脱抽象的命运).其实我们想想,一个类去实现一个接口也不就是一个实体子类把一个抽象的所以抽象方法实例化(重写了 抽象父类 中全部抽象方法),当然抽象类和接口还是有区别的.我上上篇就写到了抽象类和接口的区别,有兴

Java 接口和抽象类区别

1.概述 一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是你对整个宏观商业业务的抽象框架,当代表业务逻辑的高层抽象层结构 合理时,你底层的具体实现需要考虑的就仅仅是一些算法和一些具体的业务实现了.当你需要再开发另一个相近的项目时,你以前的抽象层说不定还可以再次利用 .面对对象的设计,复用的重点其实应该是抽象层的复用,而不是具体某一个代码块的复用. 说到了抽象,我就不能不提到曾让我头痛的Java接口和Java抽象类了,这也是本文我想说的重点. 既然面向对象设计的重点在于

抽象类与接口分析

抽象类: 定义:包含抽象方法的类称为抽象类. 语法:抽象类和抽象方法都必须用abstract声明 抽象类可声明但不可直接实例化,抽象类的实例化必须依靠子类继承来完成. 抽象类中可包含构造方法,但依靠子类调用. 代码示例: abstract class A{ public A(){ // 构造方法 System.out.println("*************************") ; } public abstract void fun() ; }; class B exte

C#OOP之八 继承 接口和抽象类

继承 在现实生活中有所谓的"种瓜得瓜.种豆得豆"的说法,在生物学概念上就是"遗传"的概念,在面向对象中"继承"就类似于生物学中的遗传,通过继承,可以更好的实现代码的重用(复用,多次使用的意思).增加扩展性.简化代码等. 下面是现实生活中的引用: 定义与使用继承 继承一次最常用的就是通过合法程序(比如遗嘱)从别人那里接受财产或爵位等,有点类似于世袭制. 另外一个含义,是人从父母那里继承一些特征,如果孩子从父母继承的身高.相貌等特征.那么在什么情况下

java-修饰词、抽象类、抽象方法

1.final:最终的.不可改变的------单独应用的机率小 1)修饰变量:变量不能被改变 2)修饰方法:方法不能被重写 3)修饰类:类不能被继承 2.static final:常量,应用率高 1)必须声明同时初始化 2)通过类名点来访问,不能被改变 3)建议:常量名所有字母都大写,多个单词用_分隔 4)编译器在编译时直接将常量替换为具体的值,效率高 3.抽象方法: 1)由abstract修饰 2)只有方法的定义,没有方法具体的实现(连{}都没有) 4.抽象类: 1)由abstract修饰 2

接口和抽象类

接口和抽象类有什么区别?接口和抽象类是不一样的概念,接口是对行为的抽象,抽象类,还是类,是对一类事物的抽象,是对根源的抽象.也就是说接口表示的是对象能够做什么,有什么行为.而抽象类是这个对象是什么.所以在接口和抽象类的使用上面,如果是对行为抽象,用接口.对是什么抽象用抽象类.另外,抽象类和接口在语法上面也有一些不同.1,接口中所有的方法都是抽象方法,抽象类中可以有(不一定有)抽象方法.2,接口中的成员变量默认都是public.static.final类型的,必须被显式初始化.3,接口中的方法会被

关于抽象类和接口

抽象类:含有abstract修饰符的类即为抽象类,它是不能创建实例对象的,含有abstract的方法必须定义在抽象类中,但抽象类中的方法不一定必须是抽象的,抽象类中的抽象方法再其子类中必须被实现,所以不能有抽象的静态方法(静态方法是不能被继承的). 接口:是一个特殊的抽象类,接口中定义的方法都必须是抽象的,接口中的方法都是public abstract类型,接口中的成员变量默认为public abstract final类型. 语法区别:① 抽象类中可以拥有普通的成员变量,接口中没有. ②抽象类