C#面向对象(OOP)入门—第二天—多态和继承(继承)

介绍:

第一天的内容主要是不同情形下的方法重载。这一部分则主要讲面向对象中继承的概念。首先用一个要点图形来定义继承。

 继承

一个简单的例子:

ClassA:

  class ClassA:ClassB
    {
        public void Display1()
        {
            Console.WriteLine("ClassA Display1");
            base.Display1();
        }
    }

ClassB:

class ClassB
    {
        public int x = 100;
        public void Display1()
        {
            Console.WriteLine("ClassB Display1");
        }
        public void Display2()
        {
            Console.WriteLine("ClassB Display2");
        }
    }

class Program
    {
        static void Main(string[] args)
        {
            ClassA a = new ClassA();
            a.Display1();
            Console.ReadKey();
        }
    }

/*
输出结果:
ClassA Display1 
ClassB Display1
*/

 在如上的例子中,ClassB是父类,ClassA是子类,ClassA继承自ClassB(或ClassB派生出ClassA)。

这个例子也会得到一个警告:“ClassA.Display1()”隐藏继承的成员“ClassB.Display1()”。如果是有意隐藏,请使用关键字 new。  意思是说ClassA中的成员和ClassB中的成员一样,这样基类的就被隐藏了。如果故意为之,可以用"public new void Display1()"来代替。

知识点:我们可以在子类中定义和基类名称相同的成员,并且子类中的方法总是优先执行然后才是基类(遇到同名的情况时)。当然也可以用base关键字,在子类中调用基类中的成员。另外,继承不能向后兼容(意思就是说基类的实例无法调用派生类的成员,这很好理解)。除了构造函数和析构函数,我们可以从基类继承任何成员。

对于类的成员,有两种类型:

  • 静态成员:类内带有static关键字,他属于这个类,可以直接访问
  • 普通成员:通过这个类的实例来访问,他仅仅属于这个类创建的那个实例
public class ClassB
 {
 }

 public class ClassA : ClassB
 {
 }

//编译时其实是:

public class ClassB:object
{
}

public class ClassA : ClassB
{
}

在C#中,如果一个类没有继承任何类,那么它也会默认继承自object类,它是所有类的共同的基类。另外一些特殊的类如:System.ValueType、System.Delegate等无法继承。

再看一个例子:

public class ClassW
  {
  }

  public class ClassX
  {
  }

  public class ClassY : ClassW, ClassX
  {
  }

 这样定义ClasssY时,会报错。知识点:在C#,一个类只能继承自一个类,不支持多继承。(其实C#的多继承可以通过接口来完成)

再看一个例子:

public class ClassW:ClassY
 {
 }

 public class ClassX:ClassW
 {
 }

 public class ClassY :  ClassX
 {
 }

 这样也会报错:涉及“ClassY”和“ClassW”的循环基类依赖项....(3个错误)

知识点:C#中不允许循环相依(Circular dependency)。也就是互相继承

再看一个例子:

public class ClassB
 {
     public int b = 100;
 }

 public class ClassA:ClassB
 {
     public int a = 100;
 }

 /// <summary>
 /// Program: used to execute the method.
 /// Contains Main method.
 /// </summary>
 public class Program
 {
     private static void Main(string[] args)
     {
         ClassB classB = new ClassB();
         ClassA classA = new ClassA();
         classA = classB;
         classB = classA;
     }
 }

 这个例子会出现错误:无法将类型“ConsoleApplication3.ClassB”隐式转换为“ConsoleApplication3.ClassA”。存在一个显式转换(是否缺少强制转换?)   

知识点:我们可以把一个派生类对象赋值给基类,但反过来不行。既(基类对象=派生类对象,可以;派生类对象=基类对象,不行)

总结:本文主要讲了继承的基本概念。

  1. 我们可以在派生类中声明已经在基类中声明的同名函数。
  2. 派生类对象调用方法时,基类总是优先执行。
  3. 保留的关键字“base”可以派生用于调用基类方法
  4. 继承向后兼容。
  5. 除了构造函数析构函数,一个类可以基类继承一切
  6. C# 继承自定义不能派生特殊 C# 之类命令 System.Enum System.Delegate System.Array
  7. 父类只可以有一个C# 支持多重继承通过
  8. C# 中的继承允许循环依赖项
  9. 我们可以将派生类对象赋值给基类,相反
  10. 我们不能int 隐式转换charchar可以转换 int。

注明:原文地址:https://codeteddy.com/2014/05/16/diving-in-oop-part-2-polymorphism-and-inheritance-inheritance/我只是在作者基础上进行了翻译和总结,并加了一点自己的理解。希望对大家有帮助。如有错误敬请指正。

 

posted @ 2017-03-22 21:14  Dean-Feng  阅读(690)  评论(0编辑  收藏  举报
Bolg of 冯广乐