C#面向对象的基本概念 (Basic C# OOP Concept) 第三部分(多态,抽象类,虚方法,密封类,静态类,接口)

9.多态

Ploy的意思就是多于一种形式。在文章开始,方法那一章节就已经接触到了多态。多个方法名称相同,而参数不同,这就是多态的一种。

方法重载方法覆盖就是用在了多态。多态有2中类型,一种是编译时多态,一种是运行时多态。

方法重载:

方法重载就是,多个方法拥有相同的方法名称,而参数个数或类型不同。

下面就是一个多态的例子,可以看到方法名称“BedRoom”被用到了2个方法中,就是2个方法有共同的方法名称"BedRoom",但是2个方法的参数是不同的。

 1 class HouseOwnerClass
 2     {
 3         //Function with parameter
 4         public void BedRoom(String nameandColor)
 5         {
 6             Console.WriteLine(nameandColor);
 7         }
 8
 9         // Same Function Name with Different Paramenter
10         public void BedRoom(String MemberName, String Color)
11         {
12             Console.WriteLine(MemberName + " Like " + Color + "Color");
13         }
14
15         static void Main(string[] args)
16         {
17             HouseOwnerClass objHouseOwner = new HouseOwnerClass();
18
19             objHouseOwner.BedRoom("My Name is Shanu I like Lavender color");
20             objHouseOwner.BedRoom("My Name is Afraz I like Light Blue color");
21             objHouseOwner.BedRoom("SHANU", "Lavender");
22             Console.ReadLine();
23
24         }
25     }

方法覆盖:

方法重载和方法覆盖的不同就是在于方法重载方法有相同的方法名称而参数不同。但是在方法覆盖中方法不仅有相同的方法名称,而且参数必须相同,返回值类型也相同。方法覆盖只能用在派生类中。 后面的章节我们就会看到方法重载和抽象方法,虚方法,密封方法之间的关系。

10.抽象类/方法

抽象类:抽象类就是给一个类前面加上"abstract"

abstract class GuestVist
    {
    }

抽象类是一个超级类。抽象类不能够被对象所访问,换句话说,抽象类是不能被实例化的。不能创建抽象类的对象。
那么我们创建一个抽象类的对象会怎么样呢?

抽象类可以包涵抽象方法和非抽象方法。在抽象类中至少要申明一个抽象方法。总而言之,派生类必须重写(override上面说的覆盖)抽象类非抽象方法。看下面的代码编译图片,会出现错误,意思是派生类必须实现父类的所有抽象方法。

下面我们看一个具体的例子来详细了解抽象方法。

 1 abstract class GuestVist
 2     {
 3          public void Guestwelcomemessage()
 4          {
 5              Console.WriteLine("Welcome to our AbstractHome");
 6          }
 7          public void GuestName()
 8          {
 9              Console.WriteLine("Guest name is: Abstract");
10          }
11          public abstract void purposeofVisit();
12
13     }
14 // derived class to inherit the abstract class
15 public class Houseclass : GuestVist
16     {
17          static void Main(string[] args)
18          {
19              Houseclass objHouse = new Houseclass();
20              objHouse.Guestwelcomemessage();
21          }
22
23          public override void purposeofVisit()
24          {
25              Console.WriteLine("Abstract just came for a Meetup and spend some time ");
26          }
27     }

在这个例子中我们可以看到在一个抽象类中,有普通的非抽象方法,和抽象方法。抽象类中,至少要有一个抽象方法。

11.虚类/方法

我们日常编程中虚方法是非常重要的。

那么什么是虚方法,我们要怎样使用虚方法呢?

继续我们的House示例:加入今天一共有5个人要来家里做客。那么我们写一个方法来显示5个客人要来访的信息。但是客人来的时候我们才发现来了20个人。一般情况下,当他们来之前,我们会知道来的人数增加还是减少。

在这种情况下,guest是一个独立的类,House 是另外一个类。为了不改变guest类里面的信息,我们要怎么通过派生类去改变数据呢?

抽象方法和虚方法有什么不同点?

两个都是用在覆盖重写方法的关键字。抽象方法只能被申明在抽象类里面。意思就是,抽象方法只能在抽象类中申明,而不能在抽象类中实现。然而虚方法能够实现。

看下面的程序:里面既有抽象方法又有虚方法。在抽象类中,虚方法里面说只有5个客人。但是在派生类中,该虚方法被override,说有20个客人。看下面的输出,结果会是虚方法里面的吗?到底是5个客人还是20个客人?测试一下便知。

 1 abstract class GuestVist
 2     {
 3         public void Guestwelcomemessage()
 4         {
 5             Console.WriteLine("Welcome to our AbstractHome");
 6         }
 7         public void GuestName()
 8         {
 9             Console.WriteLine("Guest name is: Abstract");
10         }
11         public abstract void purposeofVisit();  // Abstract Method
12         public virtual void NoofGuestwillvisit()  // Virtual Method
13
14         {
15             Console.WriteLine("Total 5 Guest will Visit your Home");
16         }
17     }
18     class AbstractHouseClass : GuestVist
19     {
20         public override void purposeofVisit()  // Abstract method Override
21         {
22             Console.WriteLine("Abstract just for a Meetup and spend some time ");
23         }
24
25        public override void NoofGuestwillvisit() // Virtual method override
26         {
27             Console.WriteLine("Total 20 Guest Visited our Home");
28         }
29
30         static void Main(string[] args)
31         {
32             AbstractHouseClass objHouse = new AbstractHouseClass();
33             objHouse.Guestwelcomemessage();
34             objHouse.purposeofVisit();
35             objHouse.NoofGuestwillvisit();
36             Console.ReadLine();
37         }
38 }

结果是20个客人。

12.密封类/方法

密封类:指的是这个类不能够被其他的类所继承,就是该类不能有派生类。

继续看House示例。在一个房子里,主人有一个私密的小房间,可能是办公或者藏保险柜之类的~~哈哈密封类就用到了这里。、

密封类 的声明 用关键字 sealed,一旦有类被声明为sealed那么其他的派生类就不能够继承该类。

那么派生类继承了sealed类会发生什么? 看代码:

下面是一个完整的sealed类代码:

 1 public sealed class OwnerofficialRoom
 2     {
 3         public void AllMyPersonalItems()
 4         {
 5             Console.WriteLine("All Items in this rooms are personal to me no one else can access or inherit me");
 6         }
 7     }
 8     class HouseSealedClass
 9     {
10         static void Main(string[] args)
11         {
12             OwnerofficialRoom obj = new OwnerofficialRoom();
13             obj.AllMyPersonalItems();
14             Console.ReadLine();
15         }
16     }

密封方法:如果我们声明一个密封方法,那么这个方法比较特殊,不能够被派生类重写(overrid)。

看house示例:类里面有虚方法和密封的虚方法。普通的虚方法能够被派生类重写,但是sealed虚方法不能够被派生类重写。

 1 //Base Class with Sealed Method
 2     public class OwnerOfficialroomwithrestriction
 3     {
 4         public virtual void message()
 5         {
 6             Console.WriteLine("Every one belongs to this house can access my items in my room except my sealed Item");
 7
 8         }
 9
10         public virtual sealed void myAccountsLoocker()
11         {
12             Console.WriteLine("This Loocker can not be inherited by other classes");
13         }
14     }
15     //Deraived method which inherits Selaed Method class
16     class HouseSealedClass : OwnerOfficialroomwithrestriction
17     {
18         public override void message()
19         {
20             Console.WriteLine("overrided in the derived class");
21         }
22
23         public override void myAccountsLoocker()
24         {
25             Console.WriteLine("The sealed method Overrides");
26         }
27 }

13.静态类/方法
已经讨论了密封类。下面来看看静态类和静态方法。

静态类和密封类一样都不能够被继承。

那么静态类和派生类有何不同?

我们可以实例化密封类,在密封类章节可以看到我在main方法里面创建了一个对象来访问密封类。在密封类里,可以既有静态方法又有非静态方法。

但是静态类不能够被实例化,就是不能够创建静态类的对象。在静态类里只能存在静态成员。

main方法就是一个静态方法。当我们创建一个控制台应用程序的时候,会看到每个类都有一个main方法。这篇文章前面说过,main方法是最最最先被执行的。因为main方法被声明为static,所以不需要被实例化。

static void Main(string[] args)
        {
        }

有趣儿的是,静态方法,静态变量等在程序一开始执行就会分配相应的内存,而非静态的是在被实例化的时候分配内存的。

我们把密封类的例子修改成静态类的例子来看一下:

派生类继承静态类会发生什么?

我们在静态类中声明非静态方法又会怎样呢?

我们创建一个静态类的示例又会怎样呢?

时间: 2024-10-12 18:28:11

C#面向对象的基本概念 (Basic C# OOP Concept) 第三部分(多态,抽象类,虚方法,密封类,静态类,接口)的相关文章

【译文】 C#面向对象的基本概念 (Basic C# OOP Concept)

译文出处:http://www.codeproject.com/Articles/838365/Basic-Csharp-OOP-Concept 列表: 类 对象 变量 方法 访问修饰符 封装 抽象化 继承 多态 抽象类/方法 虚方法 密封类/方法 静态类/方法 接口 简介: 关于C#面向对象我们能在网上找到很多解释,但在我的文章中我会用一个非常简单的例子来解释.该文章我会用一个House(房子)就像我们居住的房子作为实际的例子来让大家更容易的理解c#面向对象概念.

C#面向对象的基本概念 (Basic C# OOP Concept) 系列二

6.封装 封装就是对外部类隐藏成员或变量.我已经说过房子的保安仅仅被限制在房子的入口处,不需要知道屋内发生了什么.房主对保安隐藏了屋内所发生的任何事,以便更安全.隐藏和限制就被称为封装. 例如我们有两个类,一个是”Houseclass”另一个是”houseSecurityClass”. 我们可以看到所有的成员都包裹在公开的类houseSecurityClass里,所以Houseclass类的对象能够访问 houseSecurityClass里的任何成员.但是Houseclass有2个成员,一个p

【转】Basic C# OOP Concept

This Article will explain a very simple way to understand the basic C# OOP Concept Download ShanuBasicCSharpOOPConceptV1.3.zip - 1.3 MB Table of Contents Class Object Variable Method Access Modifiers Encapsulation Abstraction Inheritance Polymorphism

c++ 概念及学习/c++ concept&learning(三)

这一篇继续说说程序设计中的基本语句:控制块 一 if类控制语句 if if else if  , else if ,else if(条件语句){如果条件为真,要做的一些事情}  if(条件语句) {如果条件为真,要做的一些事情} else{如果条件为假,要做的一些事情} if (条件语句1){  如果条件为真1,要做的一些事情} else{ 如果条件都为假时,要做的一些事情} 1 #include "stdafx.h" 2 #include <iostream> 3 4 i

009.面向对象之多态、封装、密封类、接口

1.多态 定义:不同对象对于同一个方法(Cut)调用表现出不同行为多态性主要是靠重写和隐藏来实现 a.(父类引用指向子类对象)b.(父类类型做参数,传递子类对象)自定义方法参数是父类类型 传递的实参是子类对象c.(父类类型作返回类型,return子类对象)自定义方法的返回类型是父类类型,return是类对象注:都是把子类对象赋给父类类型 举例: 添加乐器类using System;using System.Collections.Generic;using System.Linq;using S

面向对象--多态、虚方法重写、抽象类、接口

多态: 一个父类有多个子类,每个子类都不尽相同 有了继承,才有了多态 虚方法:关键字 virtual 重写  override 父类中的方法在子类中并不适用,那么子类需要自主更改继承的方法或是属性, 父类中加了virtual关键字的方法才可以被子类重写,子类重写父类的方法使用的是override关键字 fly.cs中: namespace 多态 { public class fly { public virtual string fling() { return "拍翅膀飞"; } }

C#面向对象的核心概念

一.面向对象的核心概念 (一)抽象--面向对象的根基 讲到抽象,不得不涉及到现代科学技术的基础--数学. 数学是一门抽象的科学,面对着纷繁复杂的世间万物,数学不理会各种事物的独特特性,而只抽取它们在数量上的特性,深刻揭示了"世间万物"在数量上表现出的共同规律,抽象正是数学的本质特征. 数学的一个分支--离散数学是计算机科学的根基之一,因此,计算机科学从诞生之日起,就与数学有着密不可分的联系,抽象思维也是计算机科学的主要思维方法之一. 在使用面向对象的方法设计一个软件系统时,首先就要区分

201671010127 2016—2017—2 面向对象的基本概念

对象就是存在的具体实体,具有明确定义的状态和行为,是面向对象编程的核心,用来描述现实世界中的实体,为计算机应用程序提供实体基础,也是完成特定任务一个封装.这样描述对象却是有点罗嗦.因为与传统的C语言不通,C语言是面向过程语言,而java语言是面向对象的语言,所以对象是java语言的核心. 在面向对象编程中(简称:OOP),现实世界的所有事物全都被视为对象.OOP的目标是在计算机程序中,模拟现实世界中的概念,我们可以借助对象的描述就能够在计算机程序中用类似的实体模拟现实世界中的实体.同时OOP也是

复习面向对象的OOA、OOD、OOP

复习 OOA.OOD.OOP OOA Object-Oriented Analysis:面向对象分析方法 是在一个系统的开发过程中进行了系统业务调查以后,依照面向对象的思想来分析问题. OOA与结构化分析有较大的差别.OOA所强调的是在系统调查资料的基础上,针对OO方法所须要的素材进行的归类分析和整理.而不是对管理业务现状和方法的分析. OOA(面向对象的分析)模型由5个层次(主题层.对象类层.结构层.属性层和服务层)和5个活动(标识对象类.标识结构.定义主题.定义属性和定义服务)组成. 在这样