【C# 复习总结】类、继承和接口

1 类

定义新的数据类型以及这些新的数据类型进行相互操作的方法

定义方式:

    class Cat
    {
    }
    class Cat:object
    {
    }
C#中所有的类都是默认由object类派生来的,显示指定或者省略效果是一样的,所以上面的两个例子是完全相同的。

C#中类包括:抽象类、密封类、非抽象类
abstract:表示修饰的类不完整,也就是抽象类,只能用做基类。 在使用是不能直接实例化,
不能使用new运算符。
sealed:表示修饰的类不可派生,也就是密封类。

base:访问最近的基类,也就是当前类继承的类

    class Cat:Animal
    {
      public void Cat()
      {
        base.Eat();
      }
    }

以上例子中base代表Animal。
注意:base只能在类的内部使用。

2 继承

2.1 继承定义

继承:    把两个或多个类的相同属性提取出来,将这些属性合在一起建立父类!

2.2 使用

  class A
    {
        public void Sum(int i,int j)
        {
            int sum = i + j;
            Console.WriteLine("I am A ,my sum ={0}",sum);
        }
    }
    class B : A
    {
        public void Minus(int i,int j)
        {
            int minus = i - j;
            Console.WriteLine("I am B ,my minus ={0}", minus);

            this.Sum(3, 4);
        }

    }
    class InheritanceTest1
    {
        static void Main(string[] args)
        {
            B b = new B();
            b.Minus(3, 4);
            Console.Read();
        }
    }

结果:I am B ,my minus=-1

     I am A ,my sum = 7

3 接口

注意:介绍接口形象生动的一篇文章,极力推荐阅读:https://www.cnblogs.com/hamburger/p/4681681.html

3.1 定义

一个接口定义一个协定。接口可以看成是特殊的抽象类,但是又有所区别。
一个接口可以从多个基接口继承,而一个类或结构可以实现多个接口。
接口可以包含方法、属性、事件和索引器。接口本身不提供它所定义的成员的实现,而抽象类中可以提供定义成员的实现。
接口只指定实现该接口的类或结构必须提供的成员。

接口本质上是一种类
不过他与类的区分还是很明显的——不能实例化
他的精髓在于提供一些类共同的地方,而且能“多继承”

我们知道所谓对象其实是数据和方法的封装。接口的作用更多的是工程上的,一般上我们用他来封装通用的行为,来达到程序的多态。

不必用object的观点来统一接口,在我的感觉中,继承简化对象结构,增加代码重用,接口抽象行为。

3.2 关于接口的几个小问题

1. 接口本质上是类吗

这个,要看你认为“类的本质是什么”了,过多纠缠于这个说法,很容易陷入文字之争,意义不大。

2. 接口和类有什么区别和联系,主要是联系

区别:
类的定义需要“实现”,接口的定义只需要“声明”;
类能实例化出一个对象,接口不能;
类只能单根继承,接口可以多根继承;
继承一个类,相当于借用了它已实现的功能,实现一个接口,相当于对外做了一个承诺;
……

联系:类可以“实现”接口

3. 接口是否具备类的特征

这要看你认为哪些是“类的特征”,hehe,比如,“编译后会生成一个 .class 文件”算不算特征……

4. 接口是否是Object

不是。但可以用一个接口型的变量来引用一个对象,而且,被引用的对象,说到底,一定是一个 Object。

1、纯虚类与接口不同的是,纯虚类可以包含一些实现
2、用纯虚类包含一些基本的功能或方法
3、用接口来定义客户端与组件之间的通讯方法
4、虚基类的实现的变化可能会影响派生类
5、使用接口要比使用继承具有更强的适用性

3.3 接口的一些特征

不可以包含任何实现;没有构造方法;任何成员都隐式声明为public;

接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念!
而类是负责功能的具体实现!

在类中也有抽象类的定义,抽象类与接口的区别在于:
抽象类是一个不完全的类,类里面有抽象的方法,属性,也可以有具体的方法和属性,需要进一步的专业化。
但接口是一个行为的规范,里面的所有东西都是抽象的!
一个类只可以继承一个基类也就是父类,但可以实现多个接口
PS:接口除了规范一个行为之外,在具体项目中的实际作用也是十分重要的,在面向对象的设计原则以及设计模式的使用中,无不体现作为一个接口的使用好处,最直接的就是设计原则中OCP(开放封闭原则),我们使用接口,而不需要关心他的具体实现,具体实现的细节变化也无关客户端(使用接口的类)的使用,对与扩展是开放的,我们可以另写一个接口的实现来扩展当前程序,而不影响上层的使用,但对修改是封闭的,即我们不能够再去修改接口的定义,当然这个 “不能够”是指在规范原则上不应该这么做!

3.4 接口的使用

接口的使用–多态的实现:
    public interface IPolimorphism()
    {
       void Say();
    }
建立一个Class1.cs文件,定义两个类,扩展IPolimorfism:
    using System;
    using System.Windows.Forms;
    namespace NorthWind
    {
      public class Red:IPolimorphism  //实现接口的方法
      {
          public void Say()  //不需要指定override关键字
          {
               MessageBox.Show("Red!");
          }
      }

      public class Yello:IPolimorphism
      {
          public void Say() //不需要指定override关键字
          {
               MessageBox.Show("Yello!");
          }
      }

    }
另一个MainFrm.cs文件,应用程序入口处:
   using System;
    using System.Windows.Forms;
    namespace NorthWind
    {
    public class MainFrm : System.Windows.Forms
    {
       [STAThread]
       static void Main()
       {
           IPolimorphism red  = new Red();
           red.Say();
           IPolimorphism yello = new Yello();
           yello.Say();
       }

    }
    }
举个例子,有一个老汉,做了一个面饼,给了他的几个儿子,老大用这个饼,加上点馅,包一下,做成了包子,老二用这个面饼,在外面刷上油,撒上料,烤一烤,做成了土家烧饼,老三呢,胡乱做,在饼上抹上乱七八糟的东西,烤一烤,做成了披萨饼.基类和派生类的关系就是这样,基类提供了基本的实现,派生类就在上面添料,最终就成了每个人心中想要的饼.
那接口的故事则不一样,老汉没有给众人面,老汉这回给儿子们画了一个饼的设计图,规定了这个饼的厚度,直径等等,然后把这个规格表发给儿子们了,儿子们拿着画的饼,各自按自己的想法去做了.
两个故事的区别告诉我们,接口是一种规格,是一个统一的标准,在实际应用中,接口有两方法的作用.
1,通过接口更容易表现设计,更容易沟通,而且接口是没有实现代码的,因此,定好接口,再写实现代码,就算设计上有变动,也可以通过接口轻易实现修改.而如果不用接口的话,你将直接去写类,好不容易实现了一个类的代码,如果设计上有少许的变动,就要去改代码.
2.接口是写类的实现者看的,这好比建筑图纸是画给施工工人看的.

原文地址:https://www.cnblogs.com/mhq-martin/p/9248187.html

时间: 2024-12-12 10:27:18

【C# 复习总结】类、继承和接口的相关文章

黑马程序员---java基础-Java类 继承&抽象&接口

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.继承 继承是所有OOP语言不可缺少的部分,在java中使用extends关键字来表示继承关系.当创建一个类时,总是在继承,如果没有明确指出要继承的类,就总是隐式地从根类Object进行继承.比如下面这段代码: 1 class Person { 2 public Person() { 3 4 } 5 } 6 class Man extends Person { 7 public Man()

人类家族类(类继承与接口实现)===API

祖先类Animal.java public class Animal{ public void eat(){ System.out.println("动物需要吃东西"); } public void drink(){ System.out.println("动物需要喝水"); } public void needsleep(){ System.out.println("动物需要睡觉"); } } 第二祖先类继承祖先类Human .java pub

PHP类继承、接口继承关系概述

PHP类继承: PHP类不支持多继承,也就是子类只能继承一个父类,但是支持多层次继承,比如: 1 class frist{ 2 public function __construct(){ 3 echo "我是第一个类.","<br>"; 4 } 5 public function printer(){ 6 echo "frist","<br>"; 7 } 8 } 9 class seconds ext

编写高质量代码改善C#程序的157个建议——建议56:使用继承ISerializable接口更灵活地控制序列化过程

建议56:使用继承ISerializable接口更灵活地控制序列化过程 接口ISerializable的意义在于,如果特性Serializable,以及与其像配套的OnDeserializedAttribute.OnDeserializingAttribute.OnSerializedAttribute.OnSerializingAttribute.NoSerializable等特性不能完全满足自定义序列化的要求,那就需要继承ISerializable了. 以下是格式化器的工作流程:如果格式化器

EF中多表公共字段,以及设置EntityBase使所有实体类继承自定义类

使用EF框架访问数据库时,如果某些表具有公共字段,例如在审核流程中,对于各类申请单资料的创建人.创建时间.修改人.修改时间,这些可能多表都需要的字段,如果在每个实体中进行赋值操作显然是类似和重复的,下面是一个统一在数据提交时进行赋值的例子(经简化,如果只是为记录时间并不用这么做),记录如下: 1. 创建一个公用接口IAudited,包含公用字段,申请单实体类继承这个接口. 2. 定义一个抽象类DbEntity(用dbml文件的EntityBase属性,使数据库实体类都继承自此类),定义OnSav

PHP类的继承和接口

PHP类的继承的一些语法 -PHP的类只支持单继承,就是每个类最多只能有一个父类或者没有父类. -子类不能继承父类使用private修饰的成员. 修饰符 可访问范围 public 当前类.子类和类外 protected 当前类和子类 private 当前类 类的类型 含义 被final修饰的类 只能实例化不能被继承 被abstract修饰的类 只能被继承不能被实例化 注意: 被final修饰的方法不能被子类重写. -通常要被子类继承的成员都使用protected,其余的尽量使用private,把

类继承接口、使用接口实例化 与 使用类实例化

一. 接口不能实例化,用接口的实现类可以实例化,将实现类的对象在内存中的地址指向接口,这个接口就可以使用了 二. 实现接口的类 实例 = new 实现接口的类()// 这样用不好吗? //这样已经不是好不好的问题了,这样的话,要接口有什么用? //用接口就是让实例和实现类的耦合度降低. //让程序更加容扩展. 以下是问题之外的知识,想看可以往下,不想看跳过. 接口 实例 = new 实现接口的类A() 接口 实例 = new 实现接口的类B() 接口 实例 = new 实现接口的类C() 这样的

php面向对象 封装继承多态 接口、重载、抽象类、最终类总结

1.面向对象 封装继承多态  接口.重载.抽象类.最终类 面向对象 封装继承多态  首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一系列个体的集合,类是一个抽象的概念2.什么是对象?从类中拿到的具有具体属性值得个体,称为对象,对象是一个具体的个体 所以,面向对象即我们专注对象来处理问题,通过从一个个具有属性和功能的类中拿到对象来处理问题. 下面我们再来细说下面向对象的三大特征:继承/封装/多态 一.继承 在PHP中我们主要通关E

探Java多线程Thread类和Runnable接口之间的联系

首先复习一下Java多线程实现机制,Java实现多线程方法有如下这么几种: 1.继承了(extends)Thread类 2.实现了(implements)Runnable接口 也就是说  有如下两种情况 情况1: 继承Thread类.重写其方法run() .    然后new之.调用Start()方法 1 public class TestThread 2 { 3 private int i; 4 public static void main(String[] args) 5 { 6 // T