当前位置:首页 » 编程软件 » 面向抽象编程

面向抽象编程

发布时间: 2023-02-05 13:54:38

A. 在C#中,类,抽象类和接口之间有什么共同点和不同点

1.接口是包含一组虚方法的抽象类型,其中每一种方法都有其名称、参数和返回值。接口方法不能包含任何实现,CLR允许接口可以包含事件、属性、索引器、静态方法、静态字段、静态构造函数以及常数。
如果创建的功能将在大范围的全异对象间使用,则使用接口。
2.抽象类提供多个派生类共享基类的公共定义,它既可以提供抽象方法,也可以提供非抽象方法。抽象类不能实例化,必须通过继承由派生类实现其抽象方法。
相同点:都不能被直接实例化,都可以通过继承实现其抽象方法。
都是面向抽象编程的技术基础,实现了诸多的设计模式。
不同点
:接口支持多继承;抽象类不能实现多继承。
接口只能定义抽象规则;抽象类既可以定义规则,还可能提供已实现的成员。
接口是一组行为规范;抽象类是一个不完全的类,着重族的概念。
接口可以用于支持回调;抽象类不能实现回调,因为继承不支持。
接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性、包含有实现的方法。
接口可以作用于值类型和引用类型;抽象类只能作用于引用类型。例如,Struct就可以继承接口,而不能继承类。

B. java 设计模式(工厂方法)

面向抽象(抽象类或接口)编程。
IWorkFactory studentWorkFactory = new StudentWorkFactory(); 注意:类型是接口类型,即抽象工厂,抽象工厂生产的是抽象产品,而new的则是具体工厂,是由子类实现的,具体工厂生产具体产品。面向抽象的好处:1.在设计抽象的时候不用管具体的实现,只要定义接口知道它用来干什么就行,这样,我只需要知道抽象接口就能继续下面的开发设计工作了,而不用事先设计具体的实现内容;2. 可以扩展多个子类实现抽象接口,更利于系统后期的扩展,而对原系统不造成任何影响,即:开-闭原则。

TeacherWork tt = new TeacherWork(); 不用说就是面向具体实现类编程,缺点就是扩展性不好,对系统后期维护扩展影响较大。

举个简单的例子:
假如在系统的A.java中代码中使用了TeacherWork 类型对象,是满足了目前软件的需求,但是,如果有一天需求变化了需要一个StudentWork 类型对象,该怎么办?只能修改A.java类来满足这样的修改需求。这样就影响了原来系统结构稳定性,需要重新调试和测试,而这带来的维护成本是非常大的,有时可能还会带来系统错误,而影响系统运行。
如果在A.java类中应用Work接口类型就不会存在这种问题,A.java不需要任何修改,只需要修改注入到A中的Work接口的具体实现类即可。

面向抽象编程的好处就在于对系统维护和扩展上,即在不影响原系统稳定运行的基础上增加新的扩展行为,即要符合“开-闭”原则。可能会因此而失去一定的效率问题,但是对于后期的维护成本来说,这个可以忽略不计。 推荐你一本好书:《软件秘笈-设计模式那点事》其中讲解的设计模式很到位,还有每个模式的静态类图和JDK中设计模式的具体分析讲解,读了收获一定很大。祝你成功!

C. 面向对象的多态详解 !!

面向对象的软件开发语言具有三个重要的特点分别为封装性、继承性、多态性。封装性即意味着对象封装其内部的数据,使其对外不可见,以保证数据的安全性。继承性是代码复用的一个很好的解决方案,但是继承关系是编译器在编译阶段就为所有的对象决定的,因而在软件工程过程中,继承性太过死板,存在很大的局限性。而多态性,它是将多种不同的特殊行为进行抽象的一种能力,通过结合继承性,多态性很好地解决了OO遇到的很多麻烦,使得面向对象的编程方式最终得到淋漓尽致的推广。

多态性和泛型编程

各种编程语言都内置了多种基本数据结构并且支持自定义数据类型,因而程序员在程序设计过程中可能会遇到多种数据类型,而针对这些数据类型的逻辑操作很有可能是雷同的。此时为每一种数据类型都设计出相应的逻辑函数似乎已经变得很不现实,因而泛型编程孕育而生了。泛型编程的出现,可以说在软件工程领域里是一个极大的进步。利用泛型编程,我们可以不为特定的类型进行专门编码,而采用对不同类型进行通用编码的方式来解决应对大量数据类型的问题。C++
STL是泛型编程的成功案例。利用Template函数,STL成功实现了对多种数据类型进行泛化的效果。而OO通过接口或者抽象类进一步实现了对类的泛化,也就是在面向对象过程中出现的新名词—多态!

多态性特点

简单来说,多态是具有表现多种形态的能力的特征,在OO中是指,语言具有根据对象的类型以不同方式处理,即指同样的消息被不同类型的对象接收时导致完全不同的行为,是对类的特定成员函数的再抽象。多态性在不同的编程语言中拥有不同的解决方案,但多态性的最终目标却始终不变,都是“以不变应万变”。

两种多态方式

一般来说,多态主要是存在两种类型:编译时的多态和运行时的多态。

1
编译时的多态主要是通过函数重载来实现的。所谓函数重载是指保持函数名不变,主要通过更改函数形参的个数以及形参的类型来定义出多个同名函数来实现对多种类型数据的逻辑处理。这种类型的多态关系是编译器在编译阶段就已经在函数调用的地方确定的,因而运行过程中速度较快,但功能比较局限。

2
运行时的多态在不同的语言中拥有不同的实现方案。C++通过虚函数的晚捆绑来实现,而Java通过面向接口编程和面向抽象编程来实现动态调用相应的函数实现。但归根结点,这些语言都是通过将多种特殊实现的类抽象为一个泛化类来实现运行多态。

面向接口编程

软件工程中程序涉及到的对象越多,对象之间相似的概率越大,因而这时候抽象变成了可能。通过定义接口,程序设计者可以成功实现对方法的定义和实现的分离,因而应用程序不必考虑子类成员函数中是如何实现内部逻辑细节,只需知道该类对象向外公开的接口便可成功操纵这类对象。而这种编程方式,为以后程序的改动以及程序的健壮性和扩展性都提供了一个比较理想的解决方案。因此面向抽象编程已经成为OO界强烈推崇的编程方式。

OO思想已经深入广大编程人员的工作中,如何能够充分合理利用OO的特点达到最优化软件体系结构将会成为每一个OO程序员应该思考的问题,相信OO思想能够为大家的软件设计带来前所未有的效果。

D. 什么叫IOC(编程术语)

IoC就是Inversion of Control,控制反转。在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这称为控制反转。

下面我们以几个例子来说明什么是IoC

假设我们要设计一个Girl和一个Boy类,其中Girl有kiss方法,即Girl想要Kiss一个Boy。那么,我们的问题是,Girl如何能够认识这个Boy?

在我们中国,常见的MM与GG的认识方式有以下几种
1 青梅竹马; 2 亲友介绍; 3 父母包办
那么哪一种才是最好呢?

青梅竹马:Girl从小就知道自己的Boy。

public class Girl {
void kiss(){
Boy boy = new Boy();
}
}

然而从开始就创建的Boy缺点就是无法在更换。并且要负责Boy的整个生命周期。如果我们的Girl想要换一个怎么办?(严重不支持Girl经常更换Boy,#_#)

亲友介绍:由中间人负责提供Boy来见面

public class Girl {
void kiss(){
Boy boy = BoyFactory.createBoy();
}
}

亲友介绍,固然是好。如果不满意,尽管另外换一个好了。但是,亲友BoyFactory经常是以Singleton的形式出现,不然就是,存在于Globals,无处不在,无处不能。实在是太繁琐了一点,不够灵活。我为什么一定要这个亲友掺和进来呢?为什么一定要付给她介绍费呢?万一最好的朋友爱上了我的男朋友呢?

父母包办:一切交给父母,自己不用费吹灰之力,只需要等着Kiss就好了。

public class Girl {
void kiss(Boy boy){
// kiss boy
boy.kiss();
}
}

Well,这是对Girl最好的方法,只要想办法贿赂了Girl的父母,并把Boy交给他。那么我们就可以轻松的和Girl来Kiss了。看来几千年传统的父母之命还真是有用哦。至少Boy和Girl不用自己瞎忙乎了。

这就是IOC,将对象的创建和获取提取到外部。由外部容器提供需要的组件。

我们知道好莱坞原则:“Do not call us, we will call you.” 意思就是,You, girlie, do not call the boy. We will feed you a boy。

我们还应该知道依赖倒转原则即 Dependence Inversion Princinple,DIP

Eric Gamma说,要面向抽象编程。面向接口编程是面向对象的核心。

组件应该分为两部分,即 Service, 所提供功能的声明 Implementation, Service的实现

好处是:多实现可以任意切换,防止 “everything depends on everything” 问题.即具体依赖于具体。

所以,我们的Boy应该是实现Kissable接口。这样一旦Girl不想kiss可恶的Boy的话,还可以kiss可爱的kitten和慈祥的grandmother。
二、IOC的type

IoC的Type指的是Girl得到Boy的几种不同方式。我们逐一来说明。

IOC type 0:不用IOC
public class Girl implements Servicable {
private Kissable kissable;
public Girl() {
kissable = new Boy();
}
public void kissYourKissable() {
kissable.kiss();
}
}

Girl自己建立自己的Boy,很难更换,很难共享给别人,只能单独使用,并负责完全的生命周期。

IOC type 1,先看代码:代码

public class Girl implements Servicable {

Kissable kissable;

public void service(ServiceManager mgr) {
kissable = (Kissable) mgr.lookup(“kissable”);
}

public void kissYourKissable() {
kissable.kiss();
}

}

这种情况出现于Avalon Framework。一个组件实现了Servicable接口,就必须实现service方法,并传入一个ServiceManager。其中会含有需要的其它组件。只需要在service方法中初始化需要的Boy。

另外,J2EE中从Context取得对象也属于type 1。它依赖于配置文件。

IOC type 2:

public class Girl {

private Kissable kissable;

public void setKissable(Kissable kissable) {
this.kissable = kissable;
}

public void kissYourKissable() {
kissable.kiss();
}

}

Type 2出现于Spring Framework,是通过JavaBean的set方法来将需要的Boy传递给Girl。它必须依赖于配置文件。

IOC type 3:

public class Girl {

private Kissable kissable;

public Girl(Kissable kissable) {
this.kissable = kissable;
}

public void kissYourKissable() {
kissable.kiss();
}

}

这就是PicoContainer的组件 。通过构造函数传递Boy给Girl

PicoContainer container = new DefaultPicoContainer();
container.(Boy.class);
container.(Girl.class);
Girl girl = (Girl) container.getComponentInstance(Girl.class);
girl.kissYourKissable();

参考资料

1 http://www.picocontainer.org/presentations/JavaPolis2003.ppt
http://www.picocontainer.org/presentations/JavaPolis2003.pdf

2 DIP, Robert C Martin, Bob大叔的优秀论文
http://www.objectmentor.com/resources/articles/dip.pdf

3 Dependency Injection 依赖注射,Matrin Fowler对DIP的扩展
http://www.martinfowler.com/articles/injection.html

4 IOC框架

PicoContainer 优秀的IOC框架
http://picocontainer.org/

Avalon
http://avalon.apache.org/

Spring Framework
http://www.springframework.org/

HiveMind
http://jakarta.apache.org/commons/hivemind

E. 面向对象设计的基本原则有哪些

SRP单一职责原则
就一个类而言,应该专注于做一件事和仅有一个引起它变化的原因。
OCP开放--封闭原则
对于扩展开放,对于修改封闭。
LSP里氏替换原则
子(继承)类能在程序中代替父类(C#:基类,Java:超类)。
DIP 依赖倒置原则
抽象不依赖于细节,细节应该依赖抽象。(面向抽象编程,C#为面向接口编程)。
ISP接口隔离原则
接口属于用户类。(接口面用用户类,不用想着和自身层次、方法相关)
REP重用发布等价原则
重用的粒度就是发布的粒度。(?这个没有具体的认识)
CCP共同封闭原则
对于需求的响应,一个包中的所以类,有一个共同的响应(改变),而对于包外是不造成影响。
CRP 共同重用原则
包中的所有类共同重用,就是要重用就全部重用。
ADP 无环依赖原则
依赖关系不要存在环。
ADP 稳定依赖原则
朝着稳定的方向进行依赖。
SAP稳定抽象原则
包的抽象程度应该和稳定程序一致。

F. java面向接口编程思想

A s=new B();
一个对象实例只能赋值给与它类型相同的引用、或者父类(包括接口)的引用。
B是A的实现类所以B的实例可以赋值给A的引用。

实例:确实的对象;引用:指向某一对象的名字。

这个耦合度是指:一个类(或者对象)对另一个类(或者对象)的依赖。
如果用类的继承,要求所有的具有某一个方法的一类对象都必须是指定类的子类对象,总是存在依赖,应用灵活度非常差!

G. C# 抽象类 和结构 和类是的用处包括构造函数 接口!!

结构我没怎么用过,认为作用不大。
抽象类和接口可以放在一起看。希望不要看完了越来越混淆。
构造函数的作用:举个简单的例子,当你在实例化一个对象的时候需要初始化类中某些属性值,可以用构造函数。还有就是当我们实例化类时通过调用不同的构造函数得到我们想要的实例对象。
什么是接口?接口是包含一组虚方法的抽象类型,其中每一种方法都有其名称、参数和返回值。接口方法不能包含任何实现,CLR允许接口可以包含事件、属性、索引器、静态方法、静态字段、静态构造函数以及常数。但是注意:C#中不能包含任何静态成员。一个类可以实现多个接口,当一个类继承某个接口时,它不仅要实现该接口定义的所有方法,还要实现该接口从其他接口中继承的所有方法。定义方法为:

public interface System.IComparable
{
int CompareTo(object o);
}

public class TestCls: IComparable
{
public TestCls()
{
}

private int _value;
public int Value
{
get { return _value; }
set { _value = value; }
}

public int CompareTo(object o)
{

//使用as模式进行转型判断
TestCls aCls = o as TestCls;
if (aCls != null)
{

//实现抽象方法
return _value.CompareTo(aCls._value);
}
}
} 什么是抽象类? 抽象类提供多个派生类共享基类的公共定义,它既可以提供抽象方法,也可以提供非抽象方法。抽象类不能实例化,必须通过继承由派生类实现其抽象方法,因此对抽象类不能使用new关键字,也不能被密封。如果派生类没有实现所有的抽象方法,则该派生类也必须声明为抽象类。另外,实现抽象方法由overriding方法来实现。定义方法为:
/// <summary>
/// 定义抽象类
/// </summary>
abstract public class Animal
{
//定义静态字段
protected int _id;

//定义属性
public abstract int Id
{
get;
set;
}

//定义方法
public abstract void Eat();

//定义索引器
public string this[int i]
{
get;
set;
}
}

/// <summary>
/// 实现抽象类
/// </summary>
public class Dog: Animal
{
public override int Id
{
get {return _id;}
set {_id = value;}
}

public override void Eat()
{
Console.Write("Dog Eats.")
}
}
相同点和不同点 相同点 都不能被直接实例化,都可以通过继承实现其抽象方法。 都是面向抽象编程的技术基础,实现了诸多的设计模式。 不同点
接口支持多继承;抽象类不能实现多继承。 接口只能定义抽象规则;抽象类既可以定义规则,还可能提供已实现的成员。 接口是一组行为规范;抽象类是一个不完全的类,着重族的概念。 接口可以用于支持回调;抽象类不能实现回调,因为继承不支持。 接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性、包含有实现的方法。 接口可以作用于值类型和引用类型;抽象类只能作用于引用类型。例如,Struct就可以继承接口,而不能继承类。 通过相同与不同的比较,我们只能说接口和抽象类,各有所长,但无优略。在实际的编程实践中,我们要视具体情况来酌情量才,但是以下的经验和积累,或许能给大家一些启示,除了我的一些积累之外,很多都来源于经典,我相信经得起考验。所以在规则与场合中,我们学习这些经典,最重要的是学以致用,当然我将以一家之言博大家之笑,看官请继续。规则与场合 请记住,面向对象思想的一个最重要的原则就是:面向接口编程。 借助接口和抽象类,23个设计模式中的很多思想被巧妙的实现了,我认为其精髓简单说来就是:面向抽象编程。 抽象类应主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。 接口着重于CAN-DO关系类型,而抽象类则偏重于IS-A式的关系; 接口多定义对象的行为;抽象类多定义对象的属性; 接口定义可以使用public、protected、internal 和private修饰符,但是几乎所有的接口都定义为public,原因就不必多说了。 “接口不变”,是应该考虑的重要因素。所以,在由接口增加扩展时,应该增加新的接口,而不能更改现有接口。 尽量将接口设计成功能单一的功能块,以.NET Framework为例,IDisposable、IDisposable、IComparable、IEquatable、IEnumerable等都只包含一个公共方法。 接口名称前面的大写字母“I”是一个约定,正如字段名以下划线开头一样,请坚持这些原则。 在接口中,所有的方法都默认为public。 如果预计会出现版本问题,可以创建“抽象类”。例如,创建了狗(Dog)、鸡(Chicken)和鸭(Duck),那么应该考虑抽象出动物(Animal)来应对以后可能出现风马牛的事情。而向接口中添加新成员则会强制要求修改所有派生类,并重新编译,所以版本式的问题最好以抽象类来实现。 从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现。 对抽象类不能使用new关键字,也不能被密封,原因是抽象类不能被实例化。 在抽象方法声明中不能使用 static 或 virtual 修饰符。 以上的规则,我就厚颜无耻的暂定为T14条吧,写的这么累,就当一时的奖赏吧。大家也可以互通有无,我将及时修订。 经典示例 绝对经典 .NET Framework是学习的最好资源,有意识的研究FCL是每个.NET程序员的必修课,关于接口和抽象类在FCL中的使用,我有以下的建议: FCL对集合类使用了基于接口的设计,所以请关注System.Collections中关于接口的设计实现; FCL对数据流相关类使用了基于抽象类的设计,所以请关注System.IO.Stream类的抽象类设计机制。 别样小菜 下面的实例,因为是我的理解,因此给经典打上“相对”的记号,至于什么时候晋升为“绝对”,就看我在.NET追求的路上,是否能够一如既往的如此执着,因此我将把相对重构到绝对为止(呵呵)。 本示例没有阐述抽象类和接口在设计模式中的应用,因为那将是另一篇有讨论价值的文本,本文着眼与概念和原则的把握,但是真正的应用来自于具体的需求规范。 设计结构如图所示: 1. 定义抽象类 public abstract class Animal
{
protected string _name;

//声明抽象属性
public abstract string Name
{
get;
}

//声明抽象方法
public abstract void Show();

//实现一般方法
public void MakeVoice()
{
Console.WriteLine("All animals can make voice!");
}
}
2. 定义接口 public interface IAction
{
//定义公共方法标签
void Move();
}
3. 实现抽象类和接口
public class Duck : Animal, IAction
{
public Duck(string name)
{
_name = name;
}

//重载抽象方法
public override void Show()
{
Console.WriteLine(_name + " is showing for you.");
}

//重载抽象属性
public override string Name
{
get { return _name;}
}

//实现接口方法
public void Move()
{
Console.WriteLine("Duck also can swim.");
}

}

public class Dog : Animal, IAction
{
public Dog(string name)
{
_name = name;
}

public override void Show()
{
Console.WriteLine(_name + " is showing for you.");
}

public override string Name
{
get { return _name; }
}

public void Move()
{
Console.WriteLine(_name + " also can run.");
}

}
4. 客户端实现
public class TestAnmial
{
public static void Main(string [] args)
{
Animal ck = new Duck("Duck");
ck.MakeVoice();
ck.Show();

Animal dog = new Dog("Dog");
dog.MakeVoice();
dog.Show();

IAction dogAction = new Dog("A big dog");
dogAction.Move();
}
}
他山之石 正所谓真理是大家看出来的,所以将园子里有创新性的观点潜列于此,一是感谢大家的共享,二是完善一家之言的不足,希望能够将领域形成知识,受用于我,受用于众。 nai认为:抽象类是提取具体类的公因式,而接口是为了将一些不相关的类“杂凑”成一个共同的群体。至于他们在各个语言中的句法,语言细节并不是我关心的重点。 桦山涧的收藏也很不错。 Artech认为:所代码共用和可扩展性考虑,尽量使用Abstract Class。当然接口在其他方面的优势,我认为也不可忽视。 shenfx认为:当在差异较大的对象间寻求功能上的共性时,使用接口;当在共性较多的对象间寻求功能上的差异时,使用抽象基类。 最后,MSDN的建议是: 如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单易行的方法来控制组件版本。通过更新基类,所有继承类都随更改自动更新。另一方面,接口一旦创建就不能更改。如果需要接口的新版本,必须创建一个全新的接口。 如果创建的功能将在大范围的全异对象间使用,则使用接口。抽象类应主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。 如果要设计小而简练的功能块,则使用接口。如果要设计大的功能单元,则使用抽象类。 如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。抽象类允许部分实现类,而接口不包含任何成员的实现。 结论接口和抽象类,是论坛上、课堂间讨论最多的话题之一,之所以将这个老话题拿出来再议,是因为从我的体会来说,深刻的理解这两个面向对象的基本内容,对于盘活面向对象的抽象化编程思想至关重要。本文基本概况了接口和抽象类的概念、异同和使用规则,从学习的观点来看,我认为这些总结已经足以表达其核心。但是,对于面向对象和软件设计的深入理解,还是建立在不断实践的基础上,Scott说自己每天坚持一个小时用来写Demo,那么我们是不是更应该勤于键盘呢。对于接口和抽象类,请多用而知其然,多想而知其奥吧。

H. 面向对象编程是什么意思

面向对象编程是以建立模型体现出来的抽象思维过程和面向对象的方法。对象的含义是指具体的某一个事物,即在现实生活中能够看得见摸得着的事物。

在面向对象程序设计中,对象所指的是计算机系统中的某一个成分。在面向对象程序设计中,对象包含两个含义,其中一个是数据,另外一个是动作。对象则是数据和动作的结合体。对象不仅能够进行操作,同时还能够及时记录下操作结果。

方法是指对象能够进行的操作,方法同时还有另外一个名称,叫做函数。方法是类中的定义函数,其具体的作用就是对对象进行描述操作。

特征

(1)对象唯一性。

每个对象都有自身唯一的标识,通过这种标识,可找到相应的对象。在对象的整个生命期中,它的标识都不改变,不同的对象不能有相同的标识。

(2)抽象性。

抽象性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关。

(3)继承性。

继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。

热点内容
cf服务器云南一区云空间 发布:2024-05-02 14:18:24 浏览:751
如何破解excel2007密码 发布:2024-05-02 14:18:23 浏览:993
ios数据上传服务器 发布:2024-05-02 13:39:27 浏览:351
Php面向对象模式 发布:2024-05-02 13:33:32 浏览:80
安卓手机软件如何快速打开 发布:2024-05-02 13:25:16 浏览:963
安卓网页图片不显示怎么办 发布:2024-05-02 13:16:00 浏览:673
虚拟机搭建linux 发布:2024-05-02 13:02:48 浏览:186
哈弗f7配置怎么使用 发布:2024-05-02 12:53:14 浏览:575
psv重新构建数据库 发布:2024-05-02 12:43:53 浏览:792
农行对公密码器的凭证号码在哪里 发布:2024-05-02 12:38:55 浏览:890