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、集合、文件(上)
面向对象封装 一.面向对象概念 面向过程:面向的是完成一件事情的过程,强调的是完成这件事情的动作. 面向对象:找个对象帮你完成这件事情. 二.面向对象封装 把方法进行封装,隐藏实现细节,外部直接调用. ...
随机推荐
- 求两个排序数组的交集和并集----时间复杂度O(n+m)
问题: 给你两个排序的数组,求两个数组的交集. 比如: A = 1 3 4 5 7, B = 2 3 5 8 9, 那么交集就是 3 5,n是a数组大小,m是b数组大小. 思路: (1)从b数组遍历取 ...
- 在CSS中水平居中和垂直居中:完整的指南
这篇文章将会按照如下思路展开: 一.水平居中 1. 行内元素水平居中 2. block元素水平居中 3. 多个块级元素水平居中 二.垂直居中 1. 行内元素水平居中 2. block元素水平居中 3. ...
- 【软件工程】Alpha冲刺 (6/6)
链接部分 队名:女生都队 组长博客: 博客链接 作业博客:博客链接 小组内容 恩泽(组长) 过去两天完成了哪些任务 描述 tomcat的学习与实现 服务器后端部署,API接口的beta版实现 后端代码 ...
- 单调队列优化dp(捡垃圾的机器人)
/************************************************************************* > File Name: a.cpp > ...
- Java-JPDA 概述
JPDA:Java 平台调试架构(Java Platform Debugger Architecture) 它是 Java 虚拟机为调试和监控虚拟机专门提供的一套接口. 一.JPDA https:// ...
- tornado框架学习
tornado是一个非阻塞的web服务器框架,每秒可以处理上千个客户端连接(都是在一个线程中,不需要为每个客户端创建线程,资源消耗少),适合用来开发web长连接应用,如long polling(轮询) ...
- 1.ibatis核心类
- ubuntu如何删除刚添加的源?
答: sudo add-apt-repository -r <source_url> 如: sudo add-apt-repository -r ppa:linaro-maintainer ...
- React里单页面div自适应浏览器高度占满屏幕
可以用绝对定位方式,让div占满屏幕,css样式如下: height: 100%; width: 100%; position: absolute; top: 0px; bottom: 0px;
- 定位上下文(补充css的position属性)
]把元素的position属性设定为relative.absolute或fixed后,继而可以使用TRBL属性,相对于另一个元素移动该元素的位置.这里的“另一个元素”,就是该元素的定位上下文. 绝对定 ...