龙空技术网

面向对象特性(3):抽象类1

chencalf 134

前言:

现时你们对“抽象类可以有方法的实现吗对吗”大体比较关心,朋友们都想要剖析一些“抽象类可以有方法的实现吗对吗”的相关知识。那么小编在网摘上网罗了一些有关“抽象类可以有方法的实现吗对吗””的相关知识,希望大家能喜欢,我们快快来了解一下吧!

1、抽象类的定义

在面向对象的概念中,所有对象都是通过类来描述的。抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。

2、为什么要有抽象类?父类知道子类一定要完成某个功能,但是每个子类完成的情况是不一样的子类以后也只会用自己重写的功能,那么父类的功能就可以定义为抽象方法。子类重写后,实例化子类(调用子类自己的)就可以了。这个父类就成为抽象类。3、一个典型的抽象类3.1 抽象类的内容

在C#中,抽象类可以包含:抽象方法、抽象属性、具体方法和具体属性。

(1)一个典型的抽象类的定义

访问修饰符 abstract class 类名{    访问修饰符 abstract 返回值类型 方法名(参数列表); //定义抽象方法    其他类成员;}

(2)抽象方法和抽象属性

// 抽象方法public abstract double GetName();// 抽象属性public abstract string Name { get; }
3.2 抽象类的例子

注意:子类必须实现父类的抽象方法,否则报错,哈哈!

(1)比如定义一个运动员类。属性有:姓名,国家,方法有:competition。每个运动员的竞赛项目内容都不同。

public abstract class Sportsman{    public String? Name { get; set; }    public String? Country { get; set; }    // 构造函数    public Sportsman() {        Console.WriteLine("Sportsman默认构造函数");    }    //构造函数方式1    public Sportsman(String name, String country) {        Name = name;        Country = country;        Console.WriteLine("Sportsman赋值的构造函数");    }    //抽象类可以有自己的属性和方法    public  void Breathe()    {        Console.WriteLine("I'm Free breathing!");    }    //注意:下面申明为抽象方法,不能有具体的实现    public abstract void Competition();}

(2)我们继承一下抽象类,其实C#和JAVA的实现都差不多,C#的例子先把

public class Runner : Sportsman{    //抽象方法,必须实现,override    public override void Competition() {        Console.WriteLine("I'm running on the playground.");    }}public class Swimmer : Sportsman{    //调用了父类的构造函数使用了:base    public Swimmer(string name, string country) : base(name, country) {        Console.WriteLine("Swimmer的构造函数");    }    //抽象方法,必须实现,override    public override void Competition()   {        Console.WriteLine("I'm swimming in the water.");    }    //随意再扩展一个方法    public void LoveWater() {        Console.WriteLine("I am LoveWater");    }}

(3)完整的代码和测试结果

// See  for more information//Console.WriteLine("Hello, World!");public abstract class Sportsman{    public String? Name { get; set; }    public String? Country { get; set; }    // 构造函数    public Sportsman() {        Console.WriteLine("Sportsman默认构造函数");    }    //构造函数方式1    public Sportsman(String name, String country) {        Name = name;        Country = country;        Console.WriteLine("Sportsman赋值的构造函数");    }    //抽象类可以有自己的属性和方法    public  void Breathe()    {        Console.WriteLine("I'm Free breathing!");    }    //注意:下面申明为抽象方法,不能有具体的实现    public abstract void Competition();}public class Runner : Sportsman{    //抽象方法,必须实现,override    public override void Competition() {        Console.WriteLine("I'm running on the playground.");    }}public class Swimmer : Sportsman{    //调用了父类的构造函数使用了:base    public Swimmer(string name, string country) : base(name, country) {        Console.WriteLine("Swimmer的构造函数");    }    //抽象方法,必须实现,override    public override void Competition()   {        Console.WriteLine("I'm swimming in the water.");    }    //随意再扩展一个方法    public void LoveWater() {        Console.WriteLine("I am LoveWater");    }}class demo{    static void Main(string[] args)    {        //(1)抽象类不能直接实例化        // Sportsman sportsman = new Sportsman();        //(2)子类继承重写后,可以实例化        Runner runner = new Runner();        runner.Competition();        runner.Breathe();        //(3)子类继承重写后,可以实例化        Swimmer swimmer = new Swimmer("Li", "China");        swimmer.Competition();        swimmer.LoveWater();        swimmer.Breathe();    }}

测试结果如下:

3、抽象类的特点

(1)抽象类不能被实例化

(2)抽象类可以有实现(包括构造函数)

(3)抽象类中可以有成员变量(包括静态成员变量)、属性、常量和静态方法,并且他们可以是非公共的。

(4)一个类只能从一个抽象类派生

(5)抽象类可以从另一个类或一个/多个接口派生(后面再补充接口)。

4、再次问问为什么要有抽象类

如果你设计了一款面向对象语言,为什么要设计抽象类。

(1)有共同可抽象的特征。

(2)这个抽象类你直接用的话还不可以,你对应设计的子类都要实现它

(3)不实现它就报错,咳咳。

标签: #抽象类可以有方法的实现吗对吗 #java继承抽象类