多态分三种:1.虚方法

2.抽象类

3.接口

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

如:

class Program
{
static void Main(string[] args)
{
Chinese cn1 = new Chinese("韩梅梅");
Chinese cn2 = new Chinese("李雷");
American a1 = new American("科比布莱恩特");
American a2 = new American("奥尼尔");
Person[] pers = { cn1, cn2, a1, a2, }; for (int i = ; i < pers.Length; i++)
{ pers[i].SayHello();
}
Console.ReadKey();
}
} /// <summary>
/// 父类——人类
/// </summary>
public class Person
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
} public Person(string name)
{
this.Name = name;
}
public virtual void SayHello()
{
Console.WriteLine("我是人类");
} } /// <summary>
/// 子类——中国人
/// </summary>
public class Chinese : Person
{
public Chinese(string name)
: base(name)
{ } public override void SayHello()
{
Console.WriteLine("我是中国人,我叫{0}", this.Name);
}
} /// <summary>
/// 子类——美国人
/// </summary>
public class American : Person
{
public American(string name)
: base(name)
{ } public override void SayHello()
{
Console.WriteLine("我叫{0},我是米国人", this.Name);
}
}

2、抽象类
当父类中的方法不知道如何去实现的时候,可以考虑将父类写成抽象类,将方法写成抽象方法。

class Program
{
static void Main(string[] args)
{
//狗狗会叫 猫咪会叫 Animal a = new Cat();//new Dog();
a.Bark(); Console.ReadKey();
}
} /// <summary>
/// 父类——动物
/// </summary>
public abstract class Animal
{ public virtual void T()
{
Console.WriteLine("动物有声明");
} private int _age; public int Age
{
get { return _age; }
set { _age = value; }
} public Animal(int age)
{
this.Age = age;
}
public abstract void Bark();
public abstract string Name
{
get;
set;
} public Animal()
{ }
} /// <summary>
/// 子类——测试
/// </summary>
public abstract class Test : Animal
{ } /// <summary>
///子类——狗
/// </summary>
public class Dog : Animal
{
public override void Bark()
{
Console.WriteLine("狗狗旺旺的叫");
} public override string Name
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
} /// <summary>
/// 子类——猫
/// </summary>
public class Cat : Animal
{
public override void Bark()
{
Console.WriteLine("猫咪喵喵的叫");
} public override string Name
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
}

抽象类特点:

1).抽象成员必须标记为abstract,并且不能有任何实现。

public abstract class Animal
{

public abstract void Bark();

}

2).抽象成员必须在抽象类中。
3).抽象类不能被实例化

4).子类继承抽象类后,必须把父类中的所有抽象成员都重写。

(除非子类也是一个抽象类,则可以不重写)
5).抽象成员的访问修饰符不能是private
6).在抽象类中可以包含实例成员。
并且抽象类的实例成员可以不被子类实现

7).抽象类是有构造函数的。虽然不能被实例化。

8)、如果父类的抽象方法中有参数,那么。继承这个抽象父类的子类在重写父类的方法的时候必须传入对应的参数。

如果抽象父类的抽象方法中有返回值,那么子类在重写这个抽象方法的时候 也必须要传入返回值。

3.接口

class Program
{
static void Main(string[] args)
{
IFlyable fly = new Bird();//new Person();
fly.Fly();
Console.ReadKey();
}
}
public class Person:IFlyable
{
public void Fly()
{
Console.WriteLine("人类在飞");
}
} public class Student
{
public void Fly()
{
Console.WriteLine("人类在飞");
}
} public class Bird : IFlyable
{
public void Fly()
{
Console.WriteLine("鸟在飞");
}
} public interface IFlyable
{
//不允许有访问修饰符 默认为public
//方法、自动属性
void Fly();
} public interface M1
{
void Test1();
} public interface M2
{
void Test2();
} public interface M3
{
void Test3();
} public interface SupperInterface : M1, M2, M3
{ } public class Car : SupperInterface
{ public void Test1()
{
throw new NotImplementedException();
} public void Test2()
{
throw new NotImplementedException();
} public void Test3()
{
throw new NotImplementedException();
}
}

接口是一种规范。
只要一个类继承了一个接口,这个类就必须实现这个接口中所有的成员

为了多态。
接口不能被实例化。
也就是说,接口不能new(不能创建对象)

接口中的成员不能加“访问修饰符”,接口中的成员访问修饰符为public,不能修改。

(默认为public)
接口中的成员不能有任何实现(“光说不做”,只是定义了一组未实现的成员)。

接口中只能有方法、属性、索引器、事件,不能有“字段”和构造函数。

接口与接口之间可以继承,并且可以多继承。

接口并不能去继承一个类,而类可以继承接口 (接口只能继承于接口,而类既可以继承接口,也可以继承类)

实现接口的子类必须实现该接口的全部成员。

一个类可以同时继承一个类并实现多个接口,如果一个子类同时继承了父类A,并实现了接口IA,那么语法上A必须写在IA的前面。

class MyClass:A,IA{},因为类是单继承的。

显示实现接口的目的:解决方法的重名问题
什么时候显示的去实现接口:
当继承的借口中的方法和参数一摸一样的时候,要是用显示的实现接口

当一个抽象类实现接口的时候,需要子类去实现接口。

======
如果父类中的方法有默认的实现,并且父类需要被实例化,这时可以考虑将父类定义成一个普通类,用虚方法来实现多态。

如果父类中的方法没有默认实现,父类也不需要被实例化,则可以将该类定义为抽象类。

C# 面向对象——多态的更多相关文章

  1. OC面向对象—多态

    OC面向对象—多态 一.基本概念 多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没有多态. 在使用多态是,会进行动态检测,以调用真实的对象方法. 多态在代码中的体现即父类指针指向子类对象. ...

  2. OC面向对象—多态

    OC面向对象—多态 一.基本概念 多态是基于继承的基础之上的,多态可以使得父类的指针指向子类的对象.如果函数或参数中使用的是父类类型,可以传入父类.子类对象,但是父类类型的变量不能直接调用子类特有的方 ...

  3. 李洪强iOS开发之OC面向对象—多态

    OC面向对象—多态 一.基本概念 多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没有多态. 在使用多态是,会进行动态检测,以调用真实的对象方法. 多态在代码中的体现即父类指针指向子类对象. ...

  4. 【基础】Equal方法、面向对象-多态-继承-封装

    package Test; public class L3_1 { public static void main(String[] args) { C c1=new C(100); C c2=new ...

  5. Python之面向对象多态

    Python之面向对象多态 多态与多态性: 多态: 多态是指一类事物有多种形态,一个抽象类有多个子类,因而多态的概念依赖于继承. 1.序列类型有多种形态:字符串.列表.元组. 2.动物有多种形态:Pe ...

  6. Java面向对象多态

    Java面向对象多态 7.2对象 7.2.1创建对象 对象是类的实例 类的名称 对象名称 = new 类的名称(); 7.3继承 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域 ...

  7. C#面向对象-多态

    面向对象的三大特性(封装,继承,多态)大多少人都应该知道.前两个的话比较容易理解.本文主要说一下面向对象中的多态. 什么是多态?不同的对象对同一操作,产生不同的执行结果.这就是多态.那么多态又包含了: ...

  8. JAVA面向对象-多态的理解

    面向对象编程有三个特征,即封装.继承和多态. 封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据. 继承是为了重用父类代码,同时为实现多态性作准备.那么什么是多 ...

  9. OC面向对象多态笔记

    面向对象的多态是建立在继承上,可以说没有继承就没有多态: 多态:父类指针指向了子类的对象: int main() { //假设已定义了Animal类和它的子类Dog,那么多态的代码体现就是 Anima ...

  10. linkin大话面向对象--多态

    java引用变量有2个类型,一个是编译时类型,一个是运行时类型: 编译时类型:声明的类型,把它看做是什么东西 运行时类型:真正的类型,实际上指的是什么东西 如果编译时类型和运行时类型不同,就出现多态. ...

随机推荐

  1. 全国Uber优步司机奖励政策 (12月28日-1月3日)

    本周已经公开奖励整的城市有:北 京.成 都.重 庆.上 海.深 圳.长 沙.佛 山.广 州.苏 州.杭 州.南 京.宁 波.青 岛.天 津.西 安.武 汉.厦 门,可按CTRL+F,搜城市名快速查找. ...

  2. TensorFlow:在PyCharm中配置TensorFlow

    在本地配置好TensorFlow后,如何在PyCharm中配置TensorFlow呢? 只需将当前的Python编译环境配置为TensFlow安装路径中的Pyhton环境,具体操作如下: 1. 打开‘ ...

  3. C#防止程序重新运行

    //禁止重复运行 bool ret; Mutex mutex = new Mutex(true, Application.ProductName, out ret); if (ret) { Appli ...

  4. CDN 缓存策略(转)

    1.CDN加速原理    通过动态域名解析,网友的请求被分配到离自己最快的服务器.CDN服务器直接返回缓存文件或通过专线代理原站的内容.    网络加速+内容缓存,有效提供访问速度 2.CDN节点数量 ...

  5. Unity AssetBundle工作流

    一.创建AssetBundle 1.在资源的Inspector视图下有一个AssetBundle的UI,第一个选项表示AssetBundle名称,第二个用于设置AssetBundle Variant, ...

  6. 最新flowable研究学习及其汉化flowable6.3中文

    flowable 是activiti的分支,现在感觉比activiti要强大一些,官网是 https://flowable.org/ 下载最新的6.31版本. 放到tomcat下面,汉化需要对flow ...

  7. 「日常温习」Hungary算法解决二分图相关问题

    前言 二分图的重点在于建模.以下的题目大家可以清晰的看出来这一点.代码相似度很高,但是思路基本上是各不相同. 题目 HDU 1179 Ollivanders: Makers of Fine Wands ...

  8. 基于Spring的最简单的定时任务实现与配置(二)

    接上一篇,原本我以为我实现的方式很简单了,在准备写(一)的时候,就去查了查别人是怎么实现定时任务的.不查还好,这一查,发现还有更简单的.所以就会有这篇文章. 本文主要是讨论,在完成Spring 项目搭 ...

  9. Java小记(1)

    return 关键字 package mytest; public class Test4 { public static void main(String[] args) { // TODO Aut ...

  10. JAVA基础学习之路(七)对象数组的定义及使用

    两种定义方式: 1.动态初始化: 定义并开辟数组:类名称 对象数组名[] = new 类名称[长度] 分布按成:类名称 对象数组名[] = null: 对象数组名 = new 类名称[长度]:   2 ...