C#基础知识及题目练习 Day12 多态 虚方法 里氏转换 抽象类 部分类 密封类 访问修饰符 接口 简单工厂设计模式

目录

多态

一、虚方法:

三、抽象类

四、部分类 密封类

五、访问修饰符

六、接口

七、简单工厂设计模式

 练习:


多态

1、概念:让一个对象能够表现出多种的状态(类型) 一个接口,多个功能

2、三种实现多态手段:虚方法、抽象类、接口

3、虚方法:在父类方法前面添加一个关键字:virtual,将该方法标记为虚方法,子类就可以重写该方法,
子类重写的时候,函数名与父类一致,方法前面添加关键字override。

4、 is :判断是否是该种类型  成功,返回true  失败:false

    as:将该变量转换成该种类型  如果成功转换,就转了,如果失败,返回null
    
     if (pers[i] is Chinese)
                {
                    Chinese ch = pers[i] as Chinese;
                }
    翻译:如果pers[i]是Chinese类型,就将pers[i]转换成Chinese类型,并赋值给ch对象

静态多态性

  • 函数重载
  • 运算符重载

动态多态性

  • 动态多态性是通过 抽象类 和 虚方法 实现的

实现多态的手段:  虚方法  抽象类   接口

 

一、虚方法:

将父类的方法标记为虚方法,使用关键字virtual.这个函数就可以被子类重新写一遍。子类重写该方法时,使用override关键字

每个类都有一个SayHello()方法。

在声明中包含virtual关键字是为了重写方法而存在的。

eg:

using System;
namespace PolymorphismApplication
{
   class Shape 
   {
      protected int width, height;
      public Shape( int a=0, int b=0)
      {
         width = a;
         height = b;
      }
      public virtual int area()
      {
         Console.WriteLine("父类的面积:");
         return 0;
      }
   }
   class Rectangle: Shape
   {
      public Rectangle( int a=0, int b=0): base(a, b)
      {

      }
      public override int area ()
      {
         Console.WriteLine("Rectangle 类的面积:");
         return (width * height); 
      }
   }
   class Triangle: Shape
   {
      public Triangle(int a = 0, int b = 0): base(a, b)
      {
      
      }
      public override int area()
      {
         Console.WriteLine("Triangle 类的面积:");
         return (width * height / 2); 
      }
   }
   class Caller
   {
      public void CallArea(Shape sh)
      {
         int a;
         a = sh.area();
         Console.WriteLine("面积: {0}", a);
      }
   }  
   class Tester
   {
      
      static void Main(string[] args)
      {
         Caller c = new Caller();
         Rectangle r = new Rectangle(10, 7);
         Triangle t = new Triangle(10, 5);
         c.CallArea(r);
         c.CallArea(t);
         Console.ReadKey();
      }
   }
}

二、里氏转换

优点

1. 提高代码的重用性,子类拥有父类的方法和属性;
2. 提高代码的可扩展性,子类可形似于父类,但异于父类,保留自我的特性。

类型转换

显示转换:父类对象转换为子类类型必须使用强制转换

Person p = new Teacher();
Teacher t = (Teacher)p;//转换成功
t.SayHi();

隐式转换:子类对象转换为父类类型可以直接转

Student stu = new Student();//转换成功
Person p = stu;
p.Show();

1、特点

1)、子类可以赋值给父类,如果有一个地方,需要一个父类作为参数,我们可以给一个子类

2)、如果父类中装的是子类对象,那么可以将这个父类强制转换为子类对象

2、子类对象可以调用父类中的成员,但是父类对象永远只能调用自己的成员。

3、关键字is/as转换:

is:表示类型转换,如果能够转换成功,则返回true 否则返回false

as:表示类型转换,如果能够转换则返回对象,否则返回null

三、抽象类

C# 允许您使用关键字 abstract 创建抽象类,用于提供接口的部分类的实现。当一个派生类继承自该抽象类时,实现即完成。抽象类包含抽象方法,抽象方法可被派生类实现。派生类具有更专业的功能。

  • 通过在类定义前面放置关键字 sealed,可以将类声明为密封类。当一个类被声明为 sealed 时,它不能被继承。抽象类不能被声明为 sealed。

抽象---具体
抽象类关键字:abstract

抽象类的特点:
1、不能被实例化,也就是说不能创建抽象类的对象
2、

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值