C#基础强化-继承与多态

摘要:
使用System.Linq;foreach(passeniteminas){if(itemisLiuguan){(itemasLiuguan).Function();}if(temisWangming){;

/**
  特性:
    单根性:一个子类只能有一个父类
    传递性:爷爷类 爹类 儿子类
  里氏转换
    1、子类可以赋值给父类
    2、如果父类装的是子类对象,则可以将这个父类转换为对应的子类 is as 关键字
    -->关键字
      1、is:返回bool类型,指示是否是这个类型
      2、as:如果转换成功返回对象,否则返回null
    作用:我们可以将所有的子类当做是父类来看,针对父类进行编程,写出通用代
    码,适应需求的不断改变
  多态:
    -->虚方法
      virtual override
    -->抽象类
      abstract override
    -->接口
      interface

*/

普通类的继承

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

/**
  继承中的非多态方式,很恶心人吧
  虚方法和抽象方法就是为了解决这个问题的
*/
namespace 普通类的继承 {
    class Program {
        static void Main(string[] args) {
            passen[] pas = { new Liuguan(), new Wangming() };
            foreach(passen item in pas) {
                if(item is Liuguan) {
                    (item as Liuguan).Function();
                }
                if(item is Wangming) {
                    (item as Wangming).Function();
                }
                //item.Function();该方式,打印出来都是"我是人"
            }
            Console.ReadLine();
        }
    }
    class passen {
        public void Function() {
            Console.WriteLine("我是人");
        }
    }
    class Liuguan : passen {
        public new void Function() {
            Console.WriteLine("我是刘冠");
        }
    }
    class Wangming : passen {
        public new void Function() {
            Console.WriteLine("我是王明");
        }
    }
}

抽象类的继承

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 抽象类的继承 {
    class Program {
        static void Main(string[] args) {
            //多态,父类可指向子类对象
            //子类可以赋值给父类,但调不出子类新增方法,反之不可
            animal[] ani = { new Cat(), new Dog(), new Pig() };
            foreach(animal item in ani) {
                item.Bark();               
                if(item is Cat) {//判断类型
                    Cat tempItem = (Cat)item;                    
                    tempItem.TextFunction();
                    //两个等价
                    Cat tempItem2 = item as Cat;
                    tempItem2.TextFunction();
                }
            }

            Console.ReadLine();
        }
    }
    //抽象类,抽象方法
    abstract class animal {
        public abstract void Bark();//抽象方法包含于抽象类中类,应用场景:父类没有办法如何确定子类如何去实现

    }
    //一个子类继承了一个抽象类,那么这个子类必须重写这个抽象父类中的所有成员
    class Cat : animal {
        public override void Bark() {//子类重写父类方法
            Console.WriteLine("cat");
        }
        public void TextFunction() {
            Console.WriteLine("测试方法");
        }
    }
    class Dog : animal {
        public override void Bark() {//子类重写父类方法
            Console.WriteLine("dog");
        }
        public void TextFunction() {
            Console.WriteLine("测试方法");
        }
    }
    class Pig : animal {
        public override void Bark() {//子类重写父类方法
            Console.WriteLine("pig");
        }
        public void TextFunction() {
            Console.WriteLine("测试方法");
        }
    }
}

虚方法类的继承

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 虚方法类的继承 {
    class Program {
        static void Main(string[] args) {
            person[] per = { new Liuguan(), new Wangming() };
            foreach(person item in per) {
                item.Function();
            }
            Console.ReadLine();
        }
    }
    class person {
        public virtual void Function() {//虚方法
            Console.WriteLine("我是人");
        }
    }
    class Liuguan : person {
        public override void Function() {
            //  base.Function();
            Console.WriteLine("我是刘冠");
        }
    }
    class Wangming : person {
        public override void Function() {
            //  base.Function();
            Console.WriteLine("我是王明");
        }
    }
    
}

免责声明:文章转载自《C#基础强化-继承与多态》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇DevExpress实现GridControl删除所有行的方法【web端权限维持】利用ADS隐藏webshell下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

android:onTouch()和onTouchEvent()的区别?看完这篇文章就知道了

Android Touch Screen 与传统Click Touch Screen不同,会有一些手势(Gesture),例如Fling,Scroll等等。这些Gesture会使用户体验大大提升。 Android中的Gesture识别(detector)是通过GestureDetector.OnGestureListener接口实现的。 首先,Androi...

那些年踩过的WebAPI的坑(一)

Visual Studio创建一个web项目, 在下一步的时候创建WebAPI项目的时候勾选web API之后,系统会生成一个web项目。 首先看一下webapi的路由配置,在App_start/webapiconfig.cs中,可以看到如下代码: 1 public static void Register(HttpConfiguration con...

JS-为金额添加千分位逗号分割符

前言:这个功能在前端页面中使用的还是比较多的,正好我们的项目中也有使用此功能,不过YY同学写的代码不像个方法的样子,一个入口中间又插了几道子,所             以,我写了下面这个方法,经过测试,适用性还是蛮好的,留在这里以备后用! <!DOCTYPE html> <html> <head> <...

ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(十) 之 自定义系统消息和总结

前言   本篇主要讲解一个东西,就是我们自定义系统消息。效果如下:   首先我们要做的准备工作就是改写 layim 的消息模板,如果不改的话就成为某个用户发送的消息了,那么体验就稍微差一些。找到模板我们看一下。   注意,红框部分是我更改后的,简单读一下可以看出来,我只是给聊天消息加了个参数 system,如果有这个参数,那么我们直接给加一个div就...

delphi的Public,Private,Protected,Published作用域【转】

【转自】http://hi.baidu.com/tony060156/blog/item/b4e81528e4080b80023bf644.html 关于Class里的成员:1.Public,2.Private,3.Protected,4.Published,以上四个class 的成员指令,它们的功用是什么??要怎么用和什么时候输入?怎样用?和C++是差...

Java设计模式学习记录-状态模式

前言 状态模式是一种行为模式,用于解决系统中复杂的对象状态转换以及各个状态下的封装等问题。状态模式是将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象的状态可以灵活多变。这样在客户端使用时无需关心对象的状态,可以实现自身的一致性处理。最近工作有些忙,更新博客慢了。还是要严格要求自己的,抽时间也要坚持学习。  状态模式 概念介绍 状态模式允许...