zoukankan      html  css  js  c++  java
  • 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 Settingslanzhi.SHENYANGMy DocumentsVisual Studio 2008ProjectsAbstractDemoAbstractDemoinDebugAbstractDemo.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();
    }
    }

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

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

    声明如下:

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

     
     
  • 相关阅读:
    session一致性架构设计实践.
    从"嘿,今晚..."谈消息安全传输中的技术点
    跨公网调用的大坑与架构优化方案
    “配置”也有架构演进?看完深有痛感
    TCP接入层的负载均衡、高可用、扩展性架构
    究竟啥才是互联网架构“高并发”
    12.Nodes
    11.Layers, Containers and Interfaces
    10.Nodes and Bindings
    9.Hierarchy Editor
  • 原文地址:https://www.cnblogs.com/littlestone/p/4302778.html
Copyright © 2011-2022 走看看