×

抽象类的使用场景

抽象类的使用场景(C#抽象类使用场景)

admin admin 发表于2023-06-01 17:36:52 浏览33 评论0

抢沙发发表评论

本文目录

C#抽象类使用场景


不知道题主明白什么是接口吗?

如果能理解接口的应用场景,那么就能很容易的理解抽象类了。

接口侧重于描述对象具有的行为(即方法),而抽象类侧重于描述对象具有的属性。二者最本质的区别在于抽象类内部可以有非抽象成员(即有该成员的具体实现代码),而接口内部只能有抽象成员。

举个简单的项目开发例子,比如某系统下存在VIP用户和普通用户两种身份的用户,他们所有的方法和属性都是相同的,但是却有着不同的实现。比如有着共同属性“等级”,VIP用户返回的是 string “VIP1-9”,普通用户返回的是 string“1-9”。那么此时有两种选择,要么是为各自写各自的类,但这样显然违背了面向对象编程思想中的“多态”;要么就是定义一个抽象基类,声明这些属性和方法却不去实现它们,而是由继承该抽象类的VIP用户子类和普通用户子类去实现。

抽象类和接口的区别,使用场景


1、相同点
A. 两者都是抽象类,都不能实例化。
B. interface实现类及abstrct class的子类都必须要实现已经声明的抽象方法。
2.、不同点
A. interface需要实现,要用implements,而abstract class需要继承,要用extends。
B. 一个类可以实现多个interface,但一个类只能继承一个abstract class。
C. interface强调特定功能的实现,而abstract class强调所属关系。
D. 尽管interface实现类及abstrct class的子类都必须要实现相应的抽象方法,但实现的形式不同。interface中的每一个方法都是抽象方法,都只是声明的(declaration, 没有方法体),实现类必须要实现。而abstract class的子类可以有选择地实现。

面向对象中接口和抽象类的区别及应用场景


简单来说,接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的,另外,实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。还有,接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承,接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用.

java中抽象类一般什么时候用到,用抽象类有


我有用过抽象类的地方是:比如android有很多的标签,然后只是数据源不一样,界面都是公用的,这时候就可以抽象一个父类,父类做一些公用的东西,子类需要重写的就拿来重写。这里要用接口的话,就有点大材小用了。abstract class在Java语言中体现了一种继承关系,要想使得 继承关系合理,父类和派生类之间必须存在“is-a“关系,即父类和派生类在概念本质上应该是相同的。对于interface来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的, 仅仅是实现了interface定义的契约而已。为了使论述便于理解,下面将通过一个简单的实例进行说明。

JAVA抽象类和接口的区别,使用场景


技术上的区别:

  1. 抽象类可以拥有方法的实现,而接口只能拥有方法的声明。

  2. 一个类只能有一个抽象的基类,但是可以有多个接口。

语义上的区别(这个更有意义,也更难理解)这个与设计相关,合理使用并且区分抽象类和接口能让自己的设计更加灵活和健壮。

抽象类代表一个类实体,只是这类实体无法被实例化。而接口则一般不能够代表实体,只能够代表一个功能,或是一个属性。

举个例子来说,图形类,Shape,能够派生为三角形,正方形等等。Shape就是一个抽象类,代表图形这个实体,但是确实无法实例化。它有一个接口,Drawable,这个接口说明它可以被画出来。从英语上面来说,Shape是名词,Drawable是形容词。这就是语义上面的差别。当然你非要把Drawable声明成抽象类,Shape变成接口,技术上确实没问题,但是这个涉及就很奇怪,难以理解。

如果你觉得不太理解,你可以追问。这两个概念确实有些模糊。

研究设计是好事情,设计意识的好坏很影响自己在软件工程这个领域能够达到的高度。


java抽象类继承具体类有什么用


这个用处是很大的啊。
1、抽象类与接口紧密相关,它们不能示例化,并且常常部分实现或根本不实现。抽象类和接口之间的一个主要差别是:类可以实现无限个接口,但仅能从一个抽象(或任何其他类型)类继承。从抽象类派生的类仍可实现接口。
2、具体应用时,可以在创建组件时使用抽象类,因为它们使您得以在某些方法中指定不变级功能,但直到需要该类的特定实现之后才实现其他方法。
3、抽象类也制定版本,因为如果在派生类中需要附加功能,则可以将其添加到基类而不中断代码。如果在开发大型项目时,对于一个派生类功能的增添,就可以直接在抽象类中添加特定的方法,在后期派生类的使用时即可对该方法进行操作的实例化而不会对以前的方法造成任何影响(因为抽象类可以部分实现,以前应用的派生类就可以不做更改)。

抽象类与接口的区别简答


区别:

1、概念的区别:

抽象类是从一些类中抽取出它们共有的属性(例如某些相同的成员变量、属性相同(修饰符、函数名、参数类型、参数个数)的方法),注意方法的修饰符可以为public或者protected(因为假如是private则子类无法继承),缺修饰符情况下默认为public,抽象类注重于对类本身的抽象,抽象方法没有方法体,仅仅是声明了该方法,让继承它的子类去实现。
而接口主要是对类的行为的抽象,接口也可以有变量和方法,但是变量以及方法的修饰符都必须分别是public static final(省略时也会默认是这个)和public abstract(省略时也会默认是这个)。

注意:
在java 8以后, 对接口做了新的修改,允许接口有默认方法default,即可以为接口添加实现方法,这样实现接口的类就不需要做任何的改动就能继承该接口所实现的该默认方法了;这样就使得接口与抽象类更相似了(因为抽象类不仅存在抽象方法,而且还可以有具体的已经实现了的方法)。

2、语法定义的区别:

抽象类通过 public abstract class 抽象类名字 {成员变量1…n; puclic abstract 返回类型 抽象方法名1…n(参数类型、参数名字1…n){};}来定义。抽象类还可以有不是抽象方法的方法。上两行只是说明了抽象方法的语法定义。
接口通过public interface 接口名字{public static final 成员变量1…n;public abstract 返回类型 方法名1…n(参数类型、参数名字1…n){};}来定义。接口只能包含抽象方法(这是以前),在java 8以后可以包含默认的实现方法default(上面已经讲过了,这里再重复一遍)。

3、单继承与多继承的区别:

在java编程语言里,类与类之间只允许单继承,即一个类只能继承一个抽象类;但是一个类可以实现多个接口implements 接口1…n,实现多继承。

4、能否包含构造方法:

接口中不允许存在构造方法,因为接口的成员变量都是static final变量,是在编译的时候就完成了初始化操作了,也不需要通过构造方法来进行初始化操作,而接口的方法是抽象方法,和抽象类一样只是声明之后让实现它的类去完善该方法体的;而抽象类可以有构造方法,因为抽象类除了有抽象的方法以外,其余地方与普通的类其实是没什么区别的,所以可以通过构造方法完成一些初始化的操作。

相同点:

1、它们都不能被实例化,就是不能直接new()为它们分配空间,而是需要通过继承或者实现它们的类将它们实例化。
2、继承或者实现它们的类都必须实现它们所有的抽象方法。假如继承该抽象类的类没有全部实现抽象方法,则还是一个抽象类。

使用它们的技巧(场景):

当我们需要研究事物的本质属性时,可以考虑使用抽象类来讲它们共有的属性抽象出来,可以减少代码量,优化程序的结构;
当我们想要对某一种行为进行研究时,可以考虑使用接口,对很多的类所共有的该方法(行为)进行抽象,让不同的类去实现属于该类的方法,通过接口变量就可以实现接口回调。

补充:

接口变量:接口可以声明变量,称为接口变量。
接口变量可以存放一个对象的引用(地址), 要求该对象的类实现对应接口。
接口回调:指把实现了某个接口的类的对象的引用赋值给该接口声明的接口变量。
通过接口变量去调用被类实现的接口的方法。
通过接口变量无法调用类中非实现接口中声明的方法。

作者:那星阿伦

链接地址:网页链接

来源:CSDN


什么是.net的接口和抽象类


一、抽象类:抽象类说白了就是对类的抽象,它通常代表一个抽象的概念,并提供一个集成的出发点,当设计新的抽象类时,一定是用来继承的,所以,在一个继承关系形成的等级结构里面,树叶节点应当是具体类,树枝节点应该是抽象类。

抽象类的特点

(1)抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法。
(2) 抽象类不能被实例化。
(3) 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类。
(4) 具体派生类必须覆盖基类的抽象方法。
(5) 抽象派生类可以覆盖基类的抽象方法,也可以不覆盖。

public abstract class Animal  

{    

//抽象类的属性  

private int age;  

private string sex;  

public int Age  

{  

get { return age; }  

set { age = value; }  

}  

//抽象类包含虚方法  

public virtual int GetAge()  

{  

return age;  

}  

//抽象类中可以包含普通方法  

public void setAge(string sex)  

{  

this.sex = sex;  

}  

//抽象类中还可以包含抽象的方法  

public abstract void Run();  

}  

public class Cat : Animal  

{  

//Cat 类继承抽象类Animal 并将Run方法重写  

public override void Run()  

{  

throw new NotImplementedException();  

}  

}  

二、接口

定义:接口是把隐式公共方法和属性组合起来,一封装特定功能的集合。

一旦类实现了接口,类就可以支持接口所指定的所有属性和成员,声明接口在语法上与声明抽象类相同,但不允许提供接口中任何成员的执行方式。

接口的特点:

(1)接口不能被实例化。

(2) 接口只能包含方法声明。

(3) 接口的成员包括方法、属性、索引器、事件,并且在具体类中完全实现。

(4) 接口中不能包含常量、字段(域)、构造函数、析构函数、静态成员。

例子

  • public interface Animal1  

  • {  

  • string Name(string name);  

  • void Run();  

  • }  

  • class Dog : Animal1  

  • {  

  • public void Run()  

  • {  

  • Console.WriteLine(“50km/h“);  

  • }  

  • public string Name(string name)  

  • {  

  • return name;   

  • }  

  • }  

接口vs抽象类

相同点:

(1) 都可以被继承。

(2) 都不能被实例化。

(3) 都可以包含方法声明。

(4) 派生类必须实现未实现的方法。

区 别:

(1) 抽象基类可以定义字段、属性、方法实现。接口只能定义属性、索引器、事件、和方法声明,不能包含字段。

(2) 抽象类是一个不完整的类,需要进一步细化,而接口是一个行为规范。

(3) 接口可以被多重实现,抽象类只能被单一继承。

(4) 抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中。

(5) 抽象类是从一系列相关对象中抽象出来的概念,因此反映的是事物的内部共性;接口是为了满足外部调用而定义的一个功能约定, 因此反映的是事物的外部特性。

(6) 接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法, 接口可以用于支持回调,而继承并不具备这个特点。
(7)抽象类中的抽象成员可以被子类部分实现,而接口必须全部实现。
(8) 抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然您也可以声明为虚的。

三、比喻

1.飞机会飞,鸟会飞,他们都继承了同一个接口“飞”;但是F22属于飞机抽象类,鸽子属于鸟抽象类。
2.就像铁门木门都是门(抽象类),你想要个门我给不了(不能实例化),但我可以给你个具体的铁门或木门(多态);而且只能是门,你不能说它是窗(单继承);一个门可以有锁(接口)也可以有门铃(多实现)。 门(抽象类)定义了你是什么,接口(锁)规定了你能做什么(一个接口最好只能做一件事,你不能要求锁也能发出声音吧(接口污染))。

四、小结

从根本上来说,抽象是从子类中发现了公共的东西,泛化出父类,然后让子类去继承父类,是自下向上产生的,而接口是根本根本不用知道子类的存在,方法如何实现还不知道,只是预先定义好某个功能罢了!以上是我对接口和抽象类的简单理解,欢迎朋友们来斧正。


(java)抽象类中方法有什么用


抽象类的作用一般是为了其子类规定一些必须的功能和方法,
但是这些方法不能够被抽象类实现.
抽象类中除了抽象方法(也就是其子类必须重写的方法),
还可以定义普通的方法,
尽管这些方法不能被抽象类的实例使用,
但它却可以被其子类
作为公用方法来使用
使用.
举个例子,
定义“多边形“抽象类(类中定义了多边形各点的数组),
除了定义那些抽象方法(及子类的实现各不相同的方法),
还可以定义子类都可以使用的通用方法,
如“多边形面积的计算“,“周长的计算“等等...这样,
其子类三角形就不用在写上述方法了...
希望对你有帮助