C#面向对象11 里氏转换
里氏转换
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 里氏转换的更多相关文章
- C#学习笔记14:面向对象继承的特点和里氏转换
面向对象: 继承:减少代码. 单根性 传递性 子类没有从父类那里继承了构造函数,只是会默认的调用父类那个无参数的构造函数 Class person { Public String Name { Ge ...
- 20151024_004_C#基础知识(C#中的访问修饰符,继承,new关键字,里氏转换,is 和 as,多态,序列化与反序列化)
1:C#中的访问修饰符 public: 公共成员,完全公开,没有访问限制. private: 私有的,只能在当前类的内部访问. protected: 受保护的,只能在当前类的内部以及该类的子类中访问. ...
- c#基础 里氏转换
1.里氏转换1).子类可以赋值给父类2).如果父类中装的是子类对象,那么可以讲这个父类强转为子类对象. 2.子类对象可以调用父类中的成员,但是父类对象永远都只能调用自己的成员. //// 1.里氏转换 ...
- c#中的里氏转换和Java中强制类型转换在多态中的应用
在c#中: 注意: 子类并没有继承父类的构造函数,而是会默认调用父类那个无参数的构造函数. 如果一个子类继承了一个父类,那么这个子类除了可以使用自己的成员外,还可以使用从父类那里继承过来的成员.但是父 ...
- 【C#基础概念】 里氏转换-as/is
里氏转换 子类可以赋值给父类.(如果有一个地方需要一个父类作为参数,我们可以给一个子类 ) 如果父类中装的是子类对象,那么可以将这个父类强转为子类对象. 创建几个类帮助我们理解: using Syst ...
- 【翻译】Selenium IDE v1.0.11 支持转换格式吗?
原文: http://blog.reallysimplethoughts.com/2011/06/10/does-selenium-ide-v1-0-11-support-changing-forma ...
- python高级-面向对象(11)
一.面向过程和面向对象 面向过程:根据业务逻辑从上到下写代码 面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程 二.类和对象 1.类的概念 面向对象编程的 ...
- Java面向对象11——多态
多态 package oop.demon01.demon06; public class Application { public static void main(String[] a ...
- 2、C#面向对象:封装、继承、多态、String、集合、文件(上)
面向对象封装 一.面向对象概念 面向过程:面向的是完成一件事情的过程,强调的是完成这件事情的动作. 面向对象:找个对象帮你完成这件事情. 二.面向对象封装 把方法进行封装,隐藏实现细节,外部直接调用. ...
随机推荐
- ubuntu 18.04 64bit下如何启动向日葵远程控制端软件?
一. 背景 从向日葵官网下载了linux版向日葵远程控制端软件,解压后直接执行Sunlloginremote发现以下错误: jello@jello:~/sunlogin_remote_linux$ . ...
- Java:基础知识点
1. 面向对象的特征 (1)封装:把过程和数据包围起来,对数据的访问只能通过已定义的界面.即现实世界可以被描绘成一系列完全自治.封装的对象,这些对象通过一个受保护的接口访问其他对象:(2)继承:是一种 ...
- Pattern Evaluation
对相关性patten质量的常用分析指标有以下这些 其中,X^2 跟 lift不是null-invariant的,也就是说当~A~B项较多时,这两个指标不是很可靠. 据Jiawei Han所言,Kulc ...
- 提高 python 效率的一些细节方式
在列表里面计数 性能:第二种计数方法比第一种快6290倍,为啥因为Python原生的内置函数都是优化过的,所以能用原生的计算的时候,尽量用原生的函数来计算. 过滤一个列表 性能:第二种方法比第一种慢近 ...
- driver.switch_to.window(driver.window_handles[0])切换到最新打开窗口
有时,使用selenium 定位页面元素时,浏览器明明打开的是需要定位的页面,但就是定位不到元素.打印一下元素page_source,会发现源码与页面不同. 主要问题是页面没有加载完成导致,需要设置 ...
- virtualbox迁移虚拟机
我用的Ubuntu16.04,下图为装好virtualbox时安装好系统后默认的存储位置. 促使我想迁移的原因是我的/home下因为虚拟机的存储原因导致/home下还剩1.5M可用空间..... 该目 ...
- FastDFS 学习总结
1.1 什么是FastDFS FastDFS是用c语言编写的一款开源的分布式文件系统.FastDFS为互联网量身定制,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标,使用 ...
- PO BAPI "BAPI_PO_CREATE1"
DATA: poheader LIKE bapimepoheader, poheaderx LIKE bapimepoheaderx, poitem LIKE ...
- .Net Core 2.*+ InfluxDB+Grafana+App Metrics实时性能监控
前言 .net core 2.* 实施性能监控 这个工具其实给运维 大大们用起来是更爽的.但是Grafana现在还没有找到中文版. 本文需要了解的相关技术与内容: InfluxDb(分布式时序数据库, ...
- vue中如何编写可复用的组件?
原文地址 Vue.js 是一套构建用户界面的渐进式框架.我们可以使用简单的 API 来实现响应式的数据绑定和组合的视图组件. 从维护视图到维护数据,Vue.js 让我们快速地开发应用.但随着业务代码日 ...