里氏转换

1.子类可以赋值给父类。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//******
//1.子类可以赋值给父类:如果有一个地方需要一个父类作为参数,我们可以给一个子类代替 //Student s = new Student();
//Person p = s;
Person p = new Student();
//例如
string str = string.Join("|", new string []{"","",""});
Console.WriteLine(str); Console.ReadKey();
}
} public class Person
{
public void PersonSay()
{
Console.WriteLine("Person");
}
}
public class Student:Person
{
public void StudentSay()
{
Console.WriteLine("Student");
}
}
public class Teacher:Person
{
public void TeacherSay()
{
Console.WriteLine("Teacher");
}
} }

2.如果父类中装的是子类对象,那么可以将这个父类强转为子类对象。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//******
//1.子类可以赋值给父类:如果有一个地方需要一个父类作为参数,我们可以给一个子类代替 Person p = new Student(); //******
//2.如果父类中装的是子类对象,那么可以将这个父类强转为子类对象。
Student ss = (Student)p;
ss.StudentSay(); Console.ReadKey();
}
} public class Person
{
public void PersonSay()
{
Console.WriteLine("Person");
}
}
public class Student:Person
{
public void StudentSay()
{
Console.WriteLine("Student");
}
}
public class Teacher:Person
{
public void TeacherSay()
{
Console.WriteLine("Teacher");
}
} }

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

4.

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//******
//1.子类可以赋值给父类:如果有一个地方需要一个父类作为参数,我们可以给一个子类代替 Person p = new Student(); //******
//2.如果父类中装的是子类对象,那么可以将这个父类强转为子类对象。
//Student ss = (Student)p;
//ss.StudentSay(); //is转换 if (p is Student)
{
Student tt = (Student)p;
tt.StudentSay();
}
else
{
Console.WriteLine("NO");
} Console.ReadKey();
}
} public class Person
{
public void PersonSay()
{
Console.WriteLine("Person");
}
}
public class Student:Person
{
public void StudentSay()
{
Console.WriteLine("Student");
}
}
public class Teacher:Person
{
public void TeacherSay()
{
Console.WriteLine("Teacher");
}
} }

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//******
//1.子类可以赋值给父类:如果有一个地方需要一个父类作为参数,我们可以给一个子类代替 Person p = new Student(); //******
//2.如果父类中装的是子类对象,那么可以将这个父类强转为子类对象。
//Student ss = (Student)p;
//ss.StudentSay(); //as转换,看对象PP是否为null,不为null则转换成功
Student pp = p as Student;
pp.StudentSay(); Console.ReadKey();
}
} public class Person
{
public void PersonSay()
{
Console.WriteLine("Person");
}
}
public class Student:Person
{
public void StudentSay()
{
Console.WriteLine("Student");
}
}
public class Teacher:Person
{
public void TeacherSay()
{
Console.WriteLine("Teacher");
}
} }

小例子:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
Person [] pers = new Person[]; Random r = new Random();
for (int i = ; i < pers.Length;i++ )
{
int rnum = r.Next(, );//1-3
switch (rnum)
{
case : pers[i] = new Person();
break;
case : pers[i] = new Student();
break;
case : pers[i] = new Teacher();
break;
}
} for(int j=;j<pers.Length;j++)
{
if(pers[j] is Student)
{
Student tt = (Student)pers[j];
tt.StudentSay();
}
else if(pers[j] is Teacher)
{
Teacher tt = (Teacher)pers[j];
tt.TeacherSay();
}
else
{
pers[j].PersonSay();
}
} Console.ReadKey();
}
} public class Person
{
public void PersonSay()
{
Console.WriteLine("Person");
}
}
public class Student : Person
{
public void StudentSay()
{
Console.WriteLine("Student");
}
}
public class Teacher : Person
{
public void TeacherSay()
{
Console.WriteLine("Teacher");
}
} }

*********

在C#语言中,共有五种访问修饰符:public、private、protected、internal、protected internal。作用范围如下表:
访问修饰符 说明
public 公有访问。不受任何限制。
private 私有访问。只限于本类成员访问,子类,实例都不能访问。
protected 保护访问。只限于本类和子类访问,实例不能访问。
internal 内部访问。只限于本项目内访问,其他不能访问。
protected internal 内部保护访问。只限于本项目或是子类访问,其他不能访问

C#面向对象11 里氏转换的更多相关文章

  1. C#学习笔记14:面向对象继承的特点和里氏转换

    面向对象: 继承:减少代码. 单根性  传递性 子类没有从父类那里继承了构造函数,只是会默认的调用父类那个无参数的构造函数 Class person { Public String Name { Ge ...

  2. 20151024_004_C#基础知识(C#中的访问修饰符,继承,new关键字,里氏转换,is 和 as,多态,序列化与反序列化)

    1:C#中的访问修饰符 public: 公共成员,完全公开,没有访问限制. private: 私有的,只能在当前类的内部访问. protected: 受保护的,只能在当前类的内部以及该类的子类中访问. ...

  3. c#基础 里氏转换

    1.里氏转换1).子类可以赋值给父类2).如果父类中装的是子类对象,那么可以讲这个父类强转为子类对象. 2.子类对象可以调用父类中的成员,但是父类对象永远都只能调用自己的成员. //// 1.里氏转换 ...

  4. c#中的里氏转换和Java中强制类型转换在多态中的应用

    在c#中: 注意: 子类并没有继承父类的构造函数,而是会默认调用父类那个无参数的构造函数. 如果一个子类继承了一个父类,那么这个子类除了可以使用自己的成员外,还可以使用从父类那里继承过来的成员.但是父 ...

  5. 【C#基础概念】 里氏转换-as/is

    里氏转换 子类可以赋值给父类.(如果有一个地方需要一个父类作为参数,我们可以给一个子类 ) 如果父类中装的是子类对象,那么可以将这个父类强转为子类对象. 创建几个类帮助我们理解: using Syst ...

  6. 【翻译】Selenium IDE v1.0.11 支持转换格式吗?

    原文: http://blog.reallysimplethoughts.com/2011/06/10/does-selenium-ide-v1-0-11-support-changing-forma ...

  7. python高级-面向对象(11)

    一.面向过程和面向对象 面向过程:根据业务逻辑从上到下写代码 面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程 二.类和对象 1.类的概念 面向对象编程的 ...

  8. Java面向对象11——多态

    多态  package oop.demon01.demon06; ​ public class Application {     public static void main(String[] a ...

  9. 2、C#面向对象:封装、继承、多态、String、集合、文件(上)

    面向对象封装 一.面向对象概念 面向过程:面向的是完成一件事情的过程,强调的是完成这件事情的动作. 面向对象:找个对象帮你完成这件事情. 二.面向对象封装 把方法进行封装,隐藏实现细节,外部直接调用. ...

随机推荐

  1. python中的break continue之用法

    Break break跳出循环,并且终止最小封闭循环. Continue continue跳过本次循环,继续执行下一次的循环. 二者区别就是break会终止循环,continue不终止循环.

  2. Qt DLL总结【一】-链接库预备知识

    1.链接库概念 静态链接库和动态链接库介绍 我们可以创建一种文件里面包含了很多函数和变量的目标代码,链接的时候只要把这个文件指示给链接程序就自动地从文件中查找符合要求的函数和变量进行链接,整个查找过程 ...

  3. koa 项目实战(六)注册接口加密

    1.创建工具类 根目录/config/tools.js const bcrypt = require('bcryptjs'); const tools = { enbcrypt(password) { ...

  4. 1.Json的学习--JSON.stringfy()

    1.JSON.parse() JSON.parse() JSON 通常用于与服务端交换数据. 在接收服务器数据时一般是字符串. 我们可以使用 JSON.parse() 方法将数据转换为 JavaScr ...

  5. mongodb 安装配置及简单使用

    步骤一: 下载网址:https://www.mongodb.com/download-center/community 根据自己的环境下载 步骤二: 安装过程只需要默认即可,需要注意的是连接工具“mo ...

  6. Python写的大小写转换小工具

    几行代码的小工具,用于进行如下转换 TRANSACTIONS ON CLOUD COMPUTING => Transactions On Cloud Computing orig = 'TRAN ...

  7. Jenkins的详细安装及使用

    操作环境:Windows 踩过的坑:1,报错403,因为tomcat限制了访问地址(https://www.cnblogs.com/luoruiyuan/p/6518508.html) 2,构建spr ...

  8. CentOS7.5安装python3并设置成系统默认python环境

    1.环境说明 系统版本:CentOS7. 安装的python版本: 2.编译环境准备(如果出现文件解压错误,wget命令无法下载等各种小意外,先把下面的环境安装一遍) yum install zlib ...

  9. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_2-4.后端项目分层分包及资源文件处理

    笔记 4.后端项目分层分包及资源文件处理     简介:项目基本目录结构,包名称建立,配置文件建立 1.基本目录结构                 controller             se ...

  10. Linux命令集锦:tmux命令

    tmux是一款优秀的终端复用软件,平时用到的强大功能有下面两个: 窗口管理:同时启用多个窗口: 保护现场:连接到远程主机之后,一旦断开,那么当前账户登录的任务就被取消了,但是使用 tmux 可以在断开 ...