首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

继承 多态 封装,该怎么处理

2012-06-07 
继承 多态 封装知道面向对象的特点是继承、多态、封装,可这些在C#中是怎么体现出来的啊!不理解!望高手指点。。

继承 多态 封装
知道面向对象的特点是继承、多态、封装,可这些在C#中是怎么体现出来的啊!不理解!望高手指点。。帮我完全搞明白面向对象。。谢谢!

[解决办法]
转自http://blog.csdn.net/qoo1983/archive/2007/05/31/1633078.aspx 
读的时候把 Java替换成C#

比较抽象,只是一种概念,刚开始学的时候无需太过于深究,如果要你一上来学JAVA就理解这些东西,有点牵强,你所要做的就是至少看到代码知道这个用到的是什么。 

封装的概念好比一辆汽车,你学开车的时候只需学会诸如踩油门、刹车,转方向盘即可,无需去了解它的发动机是如何发动。 

继承,先说说我对类的理解,类起到的作用有:分类(你所用某个类创建的对象实际上该类的个案)和模板的作用,那么继承则起到了对类再次分类的作用,比如,有个类“动物”,“哺乳动物”继承“动物”,再往下“马”又继承了“哺乳动物”这个类。在这里,我们从下往上讲,首先,我们把某种东西划分出来,叫做“马”(当然还有“牛”,“鱼”等等),接着,我们发现,“马”,“羊”等还有很多共同的特点,于是,我们再次划分出了“哺乳动物”这个类,再次分类,我们则有了“动物”。但在实际开发中,我们一般是从上往下定义的,即先有了“动物”,再有“哺乳动物”,最后有“马”。 

多态,正如上面朋友所说一重写,二重载。用汉字来打个比方,比如“开”这个字,在不同的时候各有的意思,比如“开门”,“开窗”,甚至有“开车”,“开饭”等,具有相同名称但操作不同。具体的实现我就不累述了。 

说说接口吧,在JAVA不支持多继承的,实际上接口起到了类似多继承的作用,一个类只能继承另一个类(或抽象类)但可以实现多个接口。打个比方,“张三”,他是一个“人”,因此他继承了“人”;与此同时,他是一个“司机”,他的平时行为还有“开车”,很显然,这并不能从“人”这个类里继承下来。怎么办?JAVA里只支持单继承,这个时候,接口就起到了作用,它定义了“司机”这个接口,“张三”实现了它,因此,他会开车了。 


[解决办法]
继承 指类间的关系,子类继承父类,子类就可以使用父类中的方法(除私有的private) 也可以重写父类中的虚方法(virtual) 
封装 指 类内部的变量,方法,属性 的私有化 private(类内部可以访问) protected(类内部和子类可访问)
多态, 指同一方法名称 的不同参数形式 getFunction(int a),getFunction(int a,string b),getFunction(int a,string b,bool c)
getFunction(long e ,double d,)这些方法就是getFunctiong的多态

希望对楼主有帮助。 实战中体会会比较深
[解决办法]
类的封装、继承和多态3种特性构成了面向对象程序设计思想的基础,通过这些基础可以最大程度地实现代码的重用,有效地降低了软件的复杂性。通过多态可以逼真地描述客观世界,使得应用程序可以完美地满足用户的要求。本节对类的封装、继承和多态性进行详细讲解。

5.7.1 封装的概念及用途
在C#中可使用类来达到数据封装的效果,这样就可以使数据与方法封装成单一元素,以便于通过方法存取数据。除此之外,还可以控制数据的存取方式。

在面向对象的世界中,大多数都是以类作为数据封装的基本单位。类将数据和操作数据的方法结合成一个单位。设计类时,不直接存取类中的数据,而是通过方法来存取数据,如此就可以达到封装数据的目的,方便以后的维护升级,也可以在操作数据时多一层判断。

此外,封装还可以解决数据存取的权限问题,可以使用封装将数据隐藏起来,形成一个封闭的空间,然后就可以设置哪些数据只能在这个空间中使用,哪些数据可以在空间外部使用。如果一个类中包含敏感数据,有些人可以访问,有些人却不能访问。如果不对这些数据的访问加以限制,后果是很严重的。所以在编写程序时,要对类的成员使用不同的访问修饰符,从而定义他们的访问级别。

5.7.2 封装的使用
ch0505实例位置:mr\05\sl\Ex05_05

下面通过实例来介绍类的封装性在实际中的应用。

程序开发步骤如下。

(1)启动Visual Studio 2005,新建一个控制台应用程序,命名为Ex05_05。

(2)该项目中添加一个类文件,默认名为Class.cs,在该文件中定义一个方法,用来输入“类的封装”字符串,代码如下:

public void OutMethod()

{

Console.WriteLine("类的封装");

}

(3)在自动生成的Program.cs文件中调用Class.cs类文件中封装的方法,代码如下:

class Program

{

static void Main(string[] args)

{

Class1 class1 = new Class1();

class1.OutMethod();

}

}

实例运行结果如图5.5所示。



图5.5 类的封装性

5.7.3 继承的概念及用途
继承是面向对象编程最重要的特性之一。任何类都可以从另外一个类继承,这就是说,这个类拥有它继承的类的所有成员。在面向对象编程中,被继承的类称为父类或基类。在C#中提供了类的继承机制,但只支持单继承,而不支持多重继承,即在C#中一次只允许继承一个类,不能同时继承多个类。

利用类的继承机制,用户可以通过增加、修改或替换类中的方法对这个类进行扩充,以适应不同的应用要求。利用继承,程序开发人员可以在已有类的基础上构造新类,这一性质使得类支持分类的概念。在日常生活中很多东西都很有条理,那是因为它们有着很好的层次分类。如果不用层次分类,则需要对每个对象都定义其所有的性质。使用继承后,每个对象就可以只定义自己的特殊性质,每一层的对象只需定义本身的性质,其他性质可以从上一层继承下来。

继承一个类时,成员的可访问性是一个重要的问题。子类不能访问基类的私有成员,但是可以访问其公共成员。这就是说,只要使用public声明成员,就可以让一个成员被基类和子类访问,同时也可以被外部的代码访问。

为了解决基类成员访问问题,C#还提供了另外一种可访问性——protected,只有派生类才能访问protected成员,基类和外部代码都不能访问protected成员。

除了成员的保护级别外,我们还可以为成员定义其继承行为。基类的成员可以是虚拟的,成员可以由继承它的类重写。子类可以提供成员的其他执行代码。这种执行代码不会删除原来的代码,仍可以在类中访问原来的代码,但外部代码不能访问它们。如果没有提供其他执行方式,外部代码就直接访问基类中成员的执行代码。

虚拟成员不能是私有成员,因为成员不能同时由子类重写也不能访问它。基类还可以定义为抽象类。抽象类不能直接实例化,要使用抽象类就必须继承这个类,然后再实例化。

说明:继承类时,需要使用冒号加类名。

5.7.4 继承的使用
ch0506实例位置:mr\05\sl\Ex05_06

下面通过实例来介绍类的继承性在实际中的应用。

程序开发步骤如下。

(1)启动Visual Studio 2005,新建一个控制台应用程序,命名为Ex05_06。

(2)在自动生成的Program.cs文件中编写如下代码:

//定义基类

public class Class1

{

public void outMethod()

{



Console.WriteLine("这是基类");

}

}

//定义继承类,该类继承于基类Class1

public class Class2:Class1

{

public void outMethod2()

{

Console.WriteLine("这是继承类");

}

}

class Program

{

static void Main(string[] args)

{

Class1 class1 = new Class1();//实例化Class1类对象

class1.outMethod();//调用Class1中的自定义方法

Class2 class2 = new Class2();//实例化Class2类对象

class2.outMethod();//使用Class2类对象调用从基类Class1中继承的自定义方法

class2.outMethod2();//调用Class2中的自定义方法

}

}

实例运行结果如图5.6所示。



图5.6 类的继承性

5.7.5 多态的概念及用途
继承使得派生类与基类在方法上有一定的重叠,因此可以使用相同的语法处理从同一个基类实例化的对象。 

多态使得子类的实例可以直接赋予基类的变量(这里不需要进行强制类型转换),然后直接就可以通过这个变量调用基类的方法。

在派生于同一个类的不同对象上执行任务时,多态是一种极为有效的技巧,使用的代码最少。可以把一组对象放到一个数组中然后调用它们的方法,在这种情况下多态的作用就体现出来了,这些对象不必是相同类型的对象。当然如果它们都继承自某个类,可以把这些派生类都放到一个数组中。如果这些对象都有同名方法,就可以调用每个对象的同名方法。

5.7.6 多态的使用
ch0507实例位置:mr\05\sl\Ex05_07

下面通过实例来介绍类的多态性在实际中的应用。

程序开发步骤如下。

(1)启动Visual Studio 2005,新建一个控制台应用程序,命名为Ex05_07。

(2)在自动生成的Program.cs文件中编写如下代码:

//定义基类

public class BaseClass

{

//定义一个virtual类型的方法,以便在派生类中重写该方法

public virtual void DoWork() { }

//定义一个virtual类型的只读属性,以便在派生类中重写该属性

public virtual int WorkProperty

{

get { return 0; }

}

}

//定义派生类

public class DerivedClass : BaseClass

{

//重写基类中方法

public override void DoWork() { }

//重写基类中的只读属性

public override int WorkProperty

{

get { return 0; }

}

}

class Program

{

static void Main(string[] args)

{

DerivedClass B = new DerivedClass();

B.DoWork(); //调用派生类中方法

BaseClass A = (BaseClass)B;

A.DoWork(); //也调用派生类中方法

}

}

说明:当派生类从基类继承时,它会获得基类的所有方法、字段、属性和事件。若要更改基类的数据和行为,有两种选择:可以使用新的派生成员替换基成员,或者可以重写虚拟的基成员。

上面的实例重写了虚拟的基成员,另外,开发人员还可以使用新的派生成员替换基类的成员,这时需要使用new关键字。如果基类定义了一个方法、字段或属性,则new关键字用于在派生类中创建该方法、字段或属性的新定义。new关键字放置在要替换的类成员的返回类型之前,例如:

public class BaseClass

{

public void DoWork() { }

public int WorkProperty

{

get { return 0; }

}

}

public class DerivedClass : BaseClass

{

public new void DoWork() { }

public new int WorkProperty

{

get { return 0; }

}

}


[解决办法]

引用楼主 aries524 的帖子:
知道面向对象的特点是继承、多态、封装,可这些在C#中是怎么体现出来的啊!不理解!望高手指点。。帮我完全搞明白面向对象。。谢谢!

[解决办法]
  封装:就是将字用private修饰,通过public的属性来访问,主要是为了提高安全性.
  继承:是为了提高代码的复用性,例如:当N个对象有着同的属性和方法时,使用继承后子类中就不用现去写基类中的属性和方法的代码,只要使用base关键字,就可以拥有基类中的所有成员.
  多态:就是同一个方法,由不同的对象调用,而输出不同的结果.多态需要继承、接口来实现。如:用基类声名,用子类实例化,当用基类对象调用方法时,系统会根据你实例不同的子类,而调用不同子类中的方法!
[解决办法]
继承(inheritance):继承是一个面向对象的词语.说明,一个类(派生类)能分享,其它类(基类)的特征和行为.派

生类和基类是"is a"的关系.
base classes(基类):通常基类可以自己实例化,或被继承.派生类继承基类中的成员,被标记为protected或更大

的权限.语法: class (derive class name):(base class name)
封装(Encapsulation):封装是一个面向对象的概念,对外部世界,隐藏类的内部.


封装优点:
1.好的封装能减少耦合.
2.类的内部的实现可以自由改变.
3.一个类有更清楚的接口.
Data Hiding(数据隐藏):封装的一个最有用的形式是数据隐藏.一个类的数据表现一个对象的状态.
修饰符支持封装:
Private:只有类本身能存取.
Protected:类和派生类可以存取.
Internal:只有同一个项目中的类可以存取.
Protected Internal:是Protected和Internal的结合. 
Public:完全存取.
other Encapsulating Strategy:(其他封装策略)属性和索引器的目的是封装一个类的细节和给类的用户提供一个公共的接口.
封装和继承的关系:
封装的意思是包容(聚合),类与类之间的关系是"has a".一个类里面有另一个类.
继承,类与类之间的关系是"is a".

多态(Polymorphism):就是怎样重载一个虚拟类.多态是面向对象的重要概念
[解决办法]
个人觉得编程思想其实是生活里面对事物的一些处理方式的一种公式化理论映射。

对于初次接触面向对象编程思想的人,我想最开始没有必要去深究“继承,封装,多态”本质上的理论意思是如何的。

理解这三个要素,确实如上面很多人说的,了解面向对象思想先了解类。
我们用如下比方来描叙:

 生物类:这是个很庞大的宏观的一个描叙,你能单纯的很具体形象直观描叙出它嘛?很难吧。这个类的概念就如同一个人的感觉样,很空洞飘渺。 这个也在编程里面就用 抽象 来形容。 其实抽象一词就很直观的能说明这种感觉。

那你想了解生物类要如何做呢? 那你可以把它分裂开来:

人类、动物类、植物类。这样分裂下来 你就会觉得对生物的理解是否有点点感觉不是那样很空洞了吧。但是还是不够。

那继续分裂:

人类分---男人、女人; 男人和女人又同时可以分为:老人、大人、小孩。

动物---这里就省略。

由此我们来看 生物类(抽象的)------》人类(人类具备有生物类的所有特性,这样你可以把人类看做是继承了生物类,也可以说人类是生物类派生出来的子类。理由是人类由生物类分裂下来的子类啊!)

人类---》男人,女人。这就是种形态上的分化了 ,男人,女人以不同的形态来体现人类的本质。因此你可以把他们看成是人类多种的形态, 因此它可以理解为是人类这个类的多态性。在这里你也许会说 那 动物类,人类,植物类都是生物类的多种形态也是多态罗 。是的,这也是种多态,同时你发现多态和继承是共存的。你不是派生类就谈不上是另外一种类的多态性了。

另外在这里更正下上面说的多态的一个误区。多态的组成并是不 继承-重写-重载。 重载不属于多态的。 多态的组成是

继承-重写-和父类应用指向子类。 这里的父类引用指向子类 如果你是初学者先不要过于强求是个什么意思,你只要了解这些概念的逻辑关系性就行了, 然后在你深入的了解基本程序编写语法结构的同时去把这些思想慢慢的融会进来去贯通,你就会能比较深的体会了 。

封装这个东西在我的理解来说,封装就是类。 呵呵 为什么这样说呢? 我们先通俗的来说封装, 封装就是说你把不想让人知道的东西用包装起来,别人只知道装的这个东西是用来干嘛的,但是不知道具体的是个什么样的东西。 比方说:你把香蕉、苹果、桔子全部装在一个箱子里面。(当然作为你自身肯定是知道装了什么) 对外别人只知道这是个水果箱,它能知道这里面有那些水果嘛? 不知道吧。 然后你要知道封装的比较大的一个目的是为了提高安全性,另外也是为了提高程序的易维护性,而且也方便代码的重用性。 同样类也是具有这一样的特性。 封装也可以说 你把每一个部件单独的让它成为一个整体,相互部件因为成为了单个的独力体,当出现问题的时候,你就可以不需要影响到其他部件,单独的把问题部件进行出来就可以了。

以上我只是把这些东西做了个通俗的和生活联系的简单浅化描叙。并不一定都是很贴切很准确的。只是想让楼主把编程思想过于的想的复杂话, 另外面向对象思想真的和生活中的处理事物的思想形式有很多类似之处。 如果能多多相互联系,对你学这门语言我想帮助会很大!

热点排行