c# 面向对象抽象类的使用

上一篇 讲了 Java 面向对象抽象类的使用。这次我们来学习 C#面向对象抽象类的使用。其实方法理论掌握了,语言只是工具。闲话少说。下面是上一篇的需求

抽象类大家都知道,但是具体有什么用,为什么要用到抽象类。大家肯定有人不太明白。培训中心老师怎么教就怎么用。最近闲来无事。研究起面向对象理论。下面让我用一个例子来说明一下。面向对象抽象类的使用方法。只是起到一个入门和抛砖引玉的作用。(理论和语言无关)

定义和概念:

面向对象的概念中,所有的对象都是通过来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

下面我们具体看看抽象类的真面目。

修饰符 abstract  class  类名  同样也适用c#

上面描述的就是抽象类。

抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。

比如,在一个图形编辑软件的分析设计过程中,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域并不是直接存在的,它就是一个抽象概念。而正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。

不能实例化那具体该怎么用呢。下面以一个简单的例子说明。

学生王小明去上海学习C#这是需求

通过上面的内容我们知道面向对象的主体是学生(面向对象开发主要就是在需求中找到对象)方法是学习  方法实现的功能是(学生+name(王小明)+"去"+address(上海)+"学习C#")

自学离不开例子,一定要找那些简单的,而且英文单词也简单的例子来进行学习(因为主要是掌握面向对象的理论,而不是学习英语)

闲言少说,开始编写代码。

至于用到的工具,及工具的使用,在此不做介绍,百度一下全有了。我想看这个文章的童鞋们已经熟练使用开发工具了。

通过主体分析是学生。第一眼看到学生会想到什么 人 对 我们先定义一个人的抽象类

Java 代码

public abstract class Person {
  String name="";//即然是人肯定是要有名字的。
  int age=0;//年龄

Person(String name,int age){
  this.name=name;
  this.age=age;
}
abstract void Study();
}

public class Student extends Person {

String address="";//多增加一个属性地址

Student(String name,int age,String address){
  super(name,age);//如果此句不明白,请查百度。太基础的东西不讲。
  this.address=address;
}

@Override
void Study(){//实现的抽象方法
  System.out.print("学生"+name+" 要去"+address+"学习Java");
}
}

C# 代码 就当我们不懂C# 那我们就照葫芦画瓢 便于区分 C#代码我们用蓝色

public abstract class Person {

  String name="";//即然是人肯定是要有名字的。
  int age=0;//年龄

Person(String name,int age){
  this.name=name;
  this.age=age;
}
abstract void Study();
}

public class Student extends Person {

String address="";//多增加一个属性地址

Student(String name,int age,String address){
  super(name,age);//如果此句不明白,请查百度。太基础的东西不讲。
  this.address=address;
}

@Override
void Study(){//实现的抽象方法
  System.out.print("学生"+name+" 要去"+address+"学习Java");
}
}

如果你这么写,编绎肯定出错。不一样的地方我改成红色代码

出错不怕。有万能的百度或是我们手里卖一本C#语法的书。查一下C#继承的语法是什么。题外话(只要掌握方法理论。语言只是一个工具。不会我们可以查手册。但是方法理论是共通的)

通过查询语法知道继承是这个样子的。

public class Student:Person  extends 换成了:这个符号

第一个红色的问题我们解决了。在解决第二个红色的问题

super(name,age);

我们在查一下百度 Java super 在C#中如何表示 万能的百度

查询发现是这个样子 :base(name,age)

好我们照着写出来

public Student(string name,int age,string address)

{
  :base(name,age)
      this.address= address;
}

可以负责的告诉你 你要是编绎一下,会出现语法错误。怎么办。其实开发人员多数时间写代码是调试和测试。这就是经验。下回在遇到同一问题可以快速解决。或是避免此问题的发生。

因为 :base(name,age) 放的位置不对正确的代码如下

public Student(string name, int age, string address)
: base(name, age)
{
   this.address= address;
}

在编绎一下你会发现还是不对,呵呵。这就是一个最基础的问题。Java的变量定义默认为 public、C#的变量定义默认为private

我们上一次的Java代码写得不规范。导致我们这次的错误发生。将上一次的代码更改一下如下

public abstract class Person {
  public String name="";
  public int age=0;

Person(String name,int age){
   this.name=name;
   this.age=age;
}

abstract void Study();
}

下面我们在将C#正确代码写出来

public abstract class Person
{
public string name = string.Empty;
public int age = 0;

public Person(string name,int age)
{
this.name = name;
this.age = age;
}

public abstract void Studey();
}

public class Student:Person
{
   string address = string.Empty;//Java中字符串默认值为空 "" c#中有此方法写义 string.Empty 空有二种方式 "" null 这个方法全搞定。不明白具体查百度

public Student(string name, int age, string address)
: base(name, age)
{

this.address= address;
}

public override void Studey()
{
  Console.Write(name + " 要去" + address + "学习"); //窗体打印字符串 查一下百度就可以知道
}

}

下面我们也写一个测试类,测试一下。

Program.cs  main 方法写在这里面。记住就可以。不明白查百度。

Person per = new Student("王小明", 38, "上海");
per.Studey();

编绎一下

------ 已启动生成: 项目: AbstractDemo, 配置: Debug Any CPU ------
AbstractDemo -> C:\Documents and Settings\lanzhi.SHENYANG\My Documents\Visual Studio 2008\Projects\AbstractDemo\AbstractDemo\bin\Debug\AbstractDemo.exe
========== 生成: 成功或最新 1 个,失败 0 个,跳过 0 个 ==========

机器不同。产生的编绎信息也不一样。总之看最后一句话,红色的。说明编绎通过了。我们运行一下。

学生王小明去上海学习C#  但是发现一个问题 屏幕一闪而过,呵呵没有看清楚,怎么办。查一下百度吧。查询也是学习的过程。我建议大家查MSDN 这个的好处。不用我多说,到时你们就会知道。就像大家不会的字查字典一样。

查询发现

Console.ReadKey();//获取用户按下的下一个字符或功能键。 按下的键显示在控制台窗口中。

还有一种查询方法,就是 Console 点一下 后面有一堆的方法,中文的解释全有。

我把修改后的代码贴上

public class Student:Person
{
    string address = string.Empty;

public Student(string name, int age, string address)
: base(name, age)
{
   this.address= address;
}

public override void Studey()
{
   Console.Write(name + " 要去" + address + "学习");
  Console.ReadKey();//获取用户按下的下一个字符或功能键。 按下的键显示在控制台窗口中。
}

这时我们在运行一下

发现屏幕上显示

学生王小明去上海学习C#  这时屏幕不闪了也不消失了。如果关掉此窗体呢。很简单按下任意键,窗体关闭了。

之前那个举一返三的程序员类我想大家也知道如何在C#中写了吧

代码如下:

class Programmer:Person
{
    string address = string.Empty;
    string child = string.Empty;

public Programmer(string name, int age, string address, string child)
: base(name, age)
{
     this.address = address;
     this.child = child;
}

public override void Studey()
{
     Console.Write(name + "带着孩子" + child + " 要去" + address + "进行C#架构师的学习");

Console.ReadKey();

}
}

class Program
{
static void Main(string[] args)
{
// Person per = new Student("王小明", 38, "上海");
//per.Studey();
     Person per = new Programmer("张小明", 38, "上海", "张小小明");
     per.Studey();
}
}

是不是感觉抽象类很有用,假如不单有学生,程序猿,还有工人、明星、记者等,只需在这个抽象类的基础上增加相应的同能,而且同时可以防止黑客去直接访问抽象类,因为抽象类不可以生成对象。还能防止因为自己的马虎造成遗漏代码。

学会用抽象的面向对象思想解决问题,是作为程序员一个良好的习惯。

声明如下:

因为本人有很多的工作要做。写这个主要是利用业余时间。难免代码有错误的地方。或文字上有错别字。还是这句话,写这些主要是教大家如何学习。理论掌握了,语言只是工具。谢谢大家在百忙之中观看此文。

时间: 2024-12-15 23:52:35

c# 面向对象抽象类的使用的相关文章

Java面向对象-抽象类

Java面向对象-抽象类 定义:在java中,含有抽象方法的类称为抽象类,同样不能生成对象: 注意点: 1,包含一个抽象方法的类是抽象类: 2,抽象类和抽象方法都要用abstract关键字修饰: 3,抽象方法只需要声明而不需要实现: 4,抽象类必须被子类继承,(假如不是抽象类)必须重写抽象父类中的全部抽象方法: 5,抽象类不能被实例化: 我们先来定义一个抽象类: 1 package com.java1234.chap03.sec11; 2 3 /** 4 * 定义一个抽象类People 5 *

面向对象抽象类的实际项目的应用

上二篇主要讲了面向对象抽象类的使用.通过Java 和c# 二个语言来说明其如何应用.举的例子也很简单.这一篇想模拟一个实际的项目来具体说明一下.采用的语言是Java必定会这种语言的童鞋很多. 实际项目: 开发一个视频的万能播放器.可以播放AVI.MPEG.RMVB 对这三种格式的视频播放. 例如:001.avi  自动选择播放AVI格式的功能 001.mpeg 自动选择播放MPEG格式的功能 001.rmvb 自动选择播放RMVB格式的功能 其它格式,提示用户.此文件格式不能进行播放.具体播放功

面向对象——抽象类和抽象方法

*概念 类中定义一些不含方法体的方法,它的方法体实现交给该类的子类根据自己的情况去实现,这样的方法就是抽象方法,包含抽象方法的类就是抽象类.抽象类能够被用于类,方法,属性,索引器和事件,使用abstract 在一个类声明中表示该类倾向要作为其它类的基类成员被标示成abstract,或被包含进一个抽象类,必须被其派生类实现. 抽象类通常代表一个抽象概念,它提供一个继承的出发点,当设计一个新的抽象类时,一定是用来继承的,所以,在一个集成关系形成的等级结构里面,树叶节点应该是具体类,而树枝节点应该是抽

Php面向对象 -- 抽象类

抽象类abstract: 有一种类,只能被继承,不能实例化对象.原因就是这个类的定义不完整. 因为php支持定义一种,只有方法的声明部分,而没有方法的实现部分的不完整方法. 如果某个类,包含了这种不完整的方法,就不是不完整类,也就不能实例化对象. 不完整的类,称之抽象类 所包含的不完整的方法,称之抽象方法. 定义: 包含抽象方法的类,就是抽象类. 语法: 定义抽象方法,利用abstract的关键字,告知php那个方法为抽象方法 如果一个类包含一个抽象方法,也就是抽象类,因此也需要使用abstra

面向对象-抽象类

老王是个高富帅.老王是具体类型,高富帅是抽象类,接口是高.富.帅. 抽象类继承有个 is-a关系,语义上“老王是个高富帅”就是继承.接口描述的是行为, 抽象类是一个具体类的抽象,而接口又是抽象类的抽象.就像LeiMing说的那样,接口和抽象类的存在更多是因为设计上的需要,为以后的扩展.在设计模式中有一个“开闭”原则,这就要求我们面向“抽象”编程,而不面向“实现”编程,因为你在设计一个类的时候永远不知道以后会有什么新的类加入进来,所以我们一个方法接受的参数尽量使用接口.    个人觉得应该多使用抽

面向对象-抽象类和接口解析

1. 什么是抽象类 在面向对象编程中,我们通过类来描述事物,这个描述可以是抽象的,因为不可能通过类描述所有的属性和行为,可能同一类事物的不同个体有着行为上的差异.例如我们想用一个类描述鸟的所有基本属性和行为,而所有的鸟都继承自这个类,我们可以把它称为基类.而鸟的叫声是有差异的,我们很难在基类中定义鸟的这个行为,这时候我们就需要用到抽象方法了,将鸟叫这个行为用抽象方法描述,让子类对象自己去实现,而包含抽象方法的类也必须声明为抽象的,这就是抽象类. 总的来说就是:抽象类可以使用抽象的方式描述事物的行

面向对象 抽象类、接口、类库、五大原则

抽象类 抽象类,只为继承而出现,不定义具体的内容,只规定该有哪些东西一般抽象类中只放置抽象方法,只规定了返回类型和参数比如: 人    - 有吃饭,睡觉方法 男人 - 继承人抽象类,必须实现吃饭,睡觉的方法主体 女人 - 继承人抽象类,必须实现吃饭,睡觉方法的主体 抽象类中可以有普通属性,通过子类来使用 1.关键字:abstract2.抽象类可以包含抽象方法和普通方法3.abstract关键字可以定义方法为抽象方法,抽象方法可以没有函数体4.抽象类无法被实例化,抽象类主要做为一个基类,让别的类继

面向对象——抽象类

当描述事物的时候,没有足够的信息对该事物进行描述,那么该描述对应得嘞就是一个抽象类. 1.没有方法铁定方法是抽象方法,一定定义在抽象类中 2.抽象类和抽象方法必须用abstract关键字修饰 3.抽象类可以不被实例化,因为抽象方法没有意义 4.抽象类必须由其子类覆盖掉所有的抽象方法之后,其子类才可以进行实例化,否则盖子类还是一个抽象类. 细节问题: 1.抽象类是一个父类 2.抽象类是有构造函数的,因为是给子类对象提供初始化动作的 3.抽象类中可以不定义抽象方法. 4.抽象关键字不能和 final

[转]面向对象 抽象类 多态

多态: 龙生九子,各有不同 同样都是继承了同一个父类,但是父类中的方法并不使用任何一个子类,那么在这就需要子类重新编写这个方法的主体 1.需要父类同意子类可以重新编写自己的方法 virtual -  虚方法2.子类只能重写父类允许重写的方法,只能重写虚方法 override - 重写覆盖虚方法所有的类都可以当做父类,都可以有虚方法 --------------------------------------------------- 抽象类:abstract 它就是为了被继承而出现的 普通的类中