abstract(抽象)

author author     2022-09-07     168

关键词:

谈到抽象,就先谈谈面向对象语言的三大特性,也是人们口中常说的封装、继承、多态。

封装:什么是封装,按到我的理解,封装就是把某些类的相关属性和方法封装,对内实现数据影城,对外提供稳定接口。

继承:从字面上理解,就是声明一个父类,然后子类可以继承,并且子类拥有父类的一切属性和方法。

多态,值一个类实例相同的方法不同情形有不同表现形式

讲完这些说说主题,抽象类和接口。

先来说说抽象类:

1)抽象类的本质还是一个类,里面可以包含一切类可以包含的
2)抽象成员 必须包含在抽象类里面,抽象类还可以包含普通成员
3)继承抽象类后,必须显示的override其抽象成员
4)抽象类不能直接实例化,声明的对象只能使用抽象类里的方法,不能用子类新增的方法
5)父类只有一个

比如说声明一个手机的抽象类,手机又打电话,品牌,系统等一些基本属性。

public abstract class BasePhone
    {
        public int Id { get; set; }
        public string Name = "123";
        public delegate void DoNothing();
        public event DoNothing DoNothingEvent;

        public void Show()
        {
            Console.WriteLine("这里是Show1");
        }
        public virtual void ShowVirtual()
        {
            Console.WriteLine("这里是Show");
        }

        /// <summary>
        /// 品牌
        /// </summary>
        /// <returns></returns>
        public abstract string Brand();

        /// <summary>
        /// 系统
        /// </summary>
        /// <returns></returns>
        public abstract string System();

        /// <summary>
        /// 打电话
        /// </summary>
        public abstract void Call();


        /// <summary>
        /// 拍照
        /// </summary>
        public abstract void Photo();

        public abstract void Do<T>();
    }

然后有一台苹果手机;应该怎么做呢,这时候就可以继承这个抽象类。

    public class iPhone : BasePhone
    {
        /// <summary>
        /// 品牌
        /// </summary>
        /// <returns></returns>
        public override string Brand()
        {
            return "iPhone";
        }

        /// <summary>
        /// 系统
        /// </summary>
        /// <returns></returns>
        public override string System()
        {
            return "IOS";
        }

        /// <summary>
        /// 打电话
        /// </summary>
        public override void Call()
        {
            Console.WriteLine("User{0} {1} {2} Call", this.GetType().Name, this.Brand(), this.System());
        }

        /// <summary>
        /// 拍照
        /// </summary>
        public override void Photo()
        {
            Console.WriteLine("User{0} {1} {2} Call", this.GetType().Name, this.Brand(), this.System());
        }


        public override void Do<T>()
        {

        }
     
    }

那如果这台手机需要实现一个支付功能呢,怎么办,可以在苹果手机类中添加一个支付功能,但是手机不只是有苹果,还有别的品牌,如果都有支付功能,不可能在每个类中都添加一个这样的方法吧,这样太麻烦了,有人会讲,在抽象类中抽象一个支付方法,但是在抽象类中添加了方法,所有继承了这个类的都需要实现这个方法,这样太不方便了,这个时候就需要接口。

1)接口不是类,里面可以包含属性、方法、事件 不能包含字段,委托,不能用访问修饰符

2)接口只能包含没有实现的方法

3)实现接口的话,必须实现全部方法

4)接口不能直接实例化,声明的对象只能使用接口里的方法,不能用子类新增的方法

5)接口可以实现多个

public interface IPay
    {
        void Pay();
    }

这样在苹果类实现这个接口,就既可以实现支付功能,又不会影响其他类。

   public class iPhone : BasePhone,  IPay
    {
        /// <summary>
        /// 品牌
        /// </summary>
        /// <returns></returns>
        public override string Brand()
        {
            return "iPhone";
        }

        /// <summary>
        /// 系统
        /// </summary>
        /// <returns></returns>
        public override string System()
        {
            return "IOS";
        }

        /// <summary>
        /// 打电话
        /// </summary>
        public override void Call()
        {
            Console.WriteLine("User{0} {1} {2} Call", this.GetType().Name, this.Brand(), this.System());
        }

        /// <summary>
        /// 拍照
        /// </summary>
        public override void Photo()
        {
            Console.WriteLine("User{0} {1} {2} Call", this.GetType().Name, this.Brand(), this.System());
        }


        public override void Do<T>()
        {

        }

       
        public void Pay()
        {
            throw new NotImplementedException();
        }
    } 

说了这么多。那么什么时候用抽象类,什么时候用接口呢

抽象是模板化,减少一定的代码量;

接口是功能化,增加一定的灵活性;

用经典的话说,就是is a,和has a 的关系。

抽象类本质还是一个类,就好比上面举的例子,BasePhone这个类他的本质还是是一份手机,只不过是把手机一些共有的性能给抽象出来一个类。

在比如IPay这个接口,它只是为了手机拥有这个功能而存在的,但不是所有的手机都拥有了这个功能,所以说只能把支付功能声明为一个接口。

最后说说重写overwrite(new)  覆写override 重载overload(方法) 

在这里就不细说了,直接通过代码是讲述。

声明一个父类:有普通方法,虚方法,抽象方法,然后子类继承,

#region abstract
    public abstract class ParentClass
    {
        /// <summary>
        /// CommonMethod
        /// </summary>
        public void CommonMethod()
        {
            Console.WriteLine("ParentClass CommonMethod");
        }

        /// <summary>
        /// virtual  虚方法  必须包含实现 但是可以被重载
        /// </summary>
        public virtual void VirtualMethod()
        {
            Console.WriteLine("ParentClass VirtualMethod");
        }

        public abstract void AbstractMethod();
    }

    public class ChildClass : ParentClass
    {
        /// <summary>
        /// new 隐藏
        /// </summary>
        public new void CommonMethod()
        {
            Console.WriteLine("ChildClass CommonMethod");
        }
        /// <summary>
        /// virtual 可以被覆写
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public override void VirtualMethod()
        {
            Console.WriteLine("ChildClass VirtualMethod");
            base.VirtualMethod();
        }

        public override void AbstractMethod()
        {
            Console.WriteLine("ChildClass AbstractMethod");
        }
    }

    
    #endregion abstract

 通过控制台程序看效果。 

class Program{
 static void Main(string[] args)
        {
   Console.WriteLine("*******************************************");
                     Console.WriteLine("*******************************************");
            Console.WriteLine("*******************************************");
            ParentClass instance = new ChildClass();
            Console.WriteLine("下面是instance.CommonMethod()");
            instance.CommonMethod();
            Console.WriteLine("下面是instance.VirtualMethod()");
            instance.VirtualMethod();
            Console.WriteLine("下面是instance.AbstractMethod()");
            instance.AbstractMethod();
}

}        

  技术分享

可以看出普通方法,是调用父类的方法,虚方法和抽象方法都是调用子类的,其实不难理解,因为虚方法和抽象方法都被子类给override(覆写)了。

那什么是重载呢,重载就是方法名相同,参数不同

 public new void CommonMethod()
        {
            Console.WriteLine("ChildClass CommonMethod");
        }

        public void CommonMethod(string name)
        {
           Console.WriteLine("ChildClass CommonMethod");
        }
       public void CommonMethod(int id)
        {
            Console.WriteLine("ChildClass CommonMethod");
        }
        public void CommonMethod(int id, string name)
        {
            Console.WriteLine("ChildClass CommonMethod");
       }

  

 





java之关键字abstract(抽象类与抽象方法)

/**abstract关键字的使用*1.abstract:抽象的*2.abstract可以用来修饰的结构:类、方法**3.abstract修饰类:抽象类*>此类不能实例化*>抽象类中一定有构造器,便于子类实例化时调用(涉及:子类对象实例化的全过程)*>开发中,都... 查看详情

abstract抽象类

抽象类的概念:是使用关键字abstract修饰的类就是抽象类;抽象类的产生:当多个不能相互继承的类具有相同的功能时,就需要将共同的信息向上抽取,放到公共的父类中;如果公共的父类只能描述所有子类都具有的功能,但描... 查看详情

abstract抽象

如有不足,多多指导 abstract可以修饰类,方法。  作用:强制使用多态  注意:1.抽象类中不一定有抽象方法,但抽象方法的类,一定是个抽象类    2.子类继承抽象类后,必须实现父类定义的所有... 查看详情

abstract关键字

一,abstract关键字:abstract关键字表示的是抽象的意思,可以用来修饰类和方法。修饰的类我们称之为抽象类,修饰的方法我们称为抽象方法二.abstract修饰类,抽象类:publicabstractclass类名{}抽象类用来表示一些抽象的概念抽象类... 查看详情

抽象abstract

...时候要先进行子类对其实例化。然后实现它的方法。  abstract和final不 查看详情

抽象类abstract

抽象类的关键字:abstract  什么是抽象类?抽象类的意思在于,该方法定义为抽象方法,不需要去写具体的方法执行体。而只需要写方法名与方法定义的关键字即可,例如:publicabstractvoid方法名();-->切记,如果方法没有具... 查看详情

抽象类abstract

抽象类就是拿来继承的抽象方法就是拿来重写的1.用abstract可以用来修饰类或方法,分别叫抽象类和抽象方法。2.含有抽象方法的类必须被声明为抽象类。,抽象类必须被继承,抽象方法也必须被重写。3.抽象类不能被实例化。4.... 查看详情

abstract抽象类

一个类,如果它至少有一个方法是抽象的,这个类必须声明为抽象的抽象类不能被实例化抽象方法只能声明,不能定义具体实现继承抽象类的子类必须定义父类所有抽象方法,且这些方法的访问控制必须和父类一样或者更宽松 查看详情

面向对象---多态-抽象

面向对象编程---抽象:可以使用abstract来修饰一个类或者方法。用abstract修饰的类表示这个类是一个抽象类,用abstract修饰的方法表示这个方法是一个抽象方法。抽象类不能被实例化。抽象方法是只有方法声明,而没有方法的实现... 查看详情

abstract

...类中可以有一个或多个抽象方法,但也可以没有抽象方法abstractclassclassName{//属性//抽象方法[访问控制修饰符]abstract返回值类型方法名(参数列表);}所谓抽象方法,是指在类中仅仅定义“要处理数据”,但“不知如何处理数据... 查看详情

abstract关键字

一,abstract关键字:   abstract关键字表示的是抽象的意思,可以用来修饰类和方法。修饰的类我们称之为抽象类,修饰的方法我们称为抽象方法二.abstract修饰类,抽象类:  publicabstractclass类名{}    ... 查看详情

abstract关键字

一,abstract关键字:   abstract关键字表示的是抽象的意思,可以用来修饰类和方法。修饰的类我们称之为抽象类,修饰的方法我们称为抽象方法二.abstract修饰类,抽象类:  publicabstractclass类名{}    ... 查看详情

abstract关键词

一,abstract关键字:   abstract关键字表示的是抽象的意思,可以用来修饰类和方法。修饰的类我们称之为抽象类,修饰的方法我们称为抽象方法二.abstract修饰类,抽象类:  publicabstractclass类名{}    ... 查看详情

12抽象函数-abstract

...抽象函数1.抽象函数就是没有函数体的函数2.抽象类使用abstract来定义3.抽象类不能生产对象,但是可以拥有构造函数 abstractvoidfun();以下代码编译不过:classPerson{  Stringname;  intage;  voidintroduce()  {    System.out.prin... 查看详情

java中的抽象类(abstract)

...的画一般都是被称为抽象的。在java里面可以使用关键字abstract修饰--个类,这样的类被称为抽象类,abstract修饰的方法叫做抽象方法。抽象类或抽象方法-般也是看不懂的,因为里面可能根本就没有代码。抽象类的特点■抽象类无法... 查看详情

抽象类abstract

packageTest;/**抽象方法子类必须重写*/publicclassAbstract   publicstaticvoidmain(String[]args)     //Animala=newAnimal();错误,抽象类不能被实例化,必须由子类实例化     AnimalOnea=newDog();//猫吃鱼     a.eat();   abstractclassAni 查看详情

abstract关键字

abstract:抽象的 1.可以用来修饰:类、方法 abstract修饰类:抽象类:    >此类不能实例化    >抽象类中一定有构造器,便于子类实例化时调用(涉及:子类对象实例化的全过程)    >开发中,都会提供... 查看详情

面向对象_06抽象类:abstract接口:interface实现:implements

抽象类:abstract抽象:没有足够的描述功能,事物不具体的描述,却又有共性。特点:  1,方法只有声明没有实现时,该方法就是抽象方法,需要被abstract修饰,抽象方法必须定义在抽象类中,该类也必须被abstract修饰。  2... 查看详情