C# 继承、虚方法、方法重载和多态
继承:继承属于单继承,只能继承一个父类。
继承的一个结果是派生于基类的子类在方法和属性上有一定的重叠。
继承只能够同时继承与一个基类;可以同时继承一个基类和多个接口,但是基类必须放在第一个。(注:C#没有多继承,如果非得想用多继承形式,只能使用接口)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Program
{
public class Aminal
{
public string Name; // 定义宠物的名字
public void PrintName()
{
Console.WriteLine("宠物的名字:" + Name);
}
}
// Dog继承Aminal类
public class Dog : Aminal
{
//
}
static void Main(string[] args)
{
Dog dog = new Dog();
dog.Name = "your name";
dog.PrintName();
}
}
}
如果需要重定义方法可以使用new关键字来隐藏父类(不用new关键字也可以,不过如果是用的是vs文本编译器会有警告)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Program
{
public class Aminal
{
public string Name; // 定义宠物的名字
public void PrintName()
{
Console.WriteLine("宠物的名字:" + Name);
}
}
// Dog继承Aminal类
public class Dog : Aminal
{
// 隐藏父类的PrintName
new public void PrintName()
{
Console.WriteLine("名字为:" + Name);
}
}
static void Main(string[] args)
{
Dog dog = new Dog();
dog.Name = "your name";
dog.PrintName();
// 访问父类的PrintName方法
((Aminal)dog).PrintName();
// 注:除了这种方法,如果想在Dog函数题里面访问父类可以使用base.<方法名>来访问
}
}
}
虚方法:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Program
{
public class Aminal
{
public Aminal(string name)
{
_name = name;
}
protected string _name; // 定义宠物的名字
// 定义虚方法
virtual public void PrintName()
{
Console.WriteLine("宠物的名字:" + _name);
}
}
// Dog继承Aminal类
public class Dog : Aminal
{
public Dog(string name) : base(name)
{
// 调用父类构造函数
}
// 重写
public override void PrintName()
{
// base.PrintName(); // 这个是调用父类的虚方法
Console.WriteLine("这是重写方法,{0}", _name);
}
}
// cat 方法
public class Cat : Aminal
{
public Cat(string name) : base(name)
{
// 调用父类构造函数
}
public override void PrintName()
{
Console.WriteLine("阿猫叫:" + _name);
}
}
static void Main(string[] args)
{
// 使用继承会显示或者隐式调用父类构造函数
Aminal dog = new Dog("your name");
dog.PrintName();
Aminal cat = new Cat("your name2");
cat.PrintName();
}
}
}
Public:公有属性,在类外可以随便访问。private:私有属性,在类外既不能够访问,也不能够修改。
Class1.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Class1
{
// 定义私有属性
private string _name;
private int _age;
public string Name
{
// 包含两个访问器
get { return _name; }
set { _name = value; }
}
// 使用快捷键Ctrl+R+E产生的接口
public int Age
{
get
{
return _age;
} set
{
// 对年龄进行判断
if(value>&&value<)
_age = value;
}
}
}
}
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)
{
// 使用类
Class1 myname = new Class1();
// 值得注意的是,单引号只能一个字符,双引号可以多个字符
myname.Name = "namejr";
myname.Age = ;
Console.WriteLine("我的名字是:" + myname.Name + ",年龄:" + myname.Age);
Console.ReadKey();
}
}
}
什么是方法重载?
方法重载就是在同一个类中使用相同的函数名,但是使用的参数类型或者数量不一样。
值得注意的是:如果写了重载函数,原来的默认的重载函数(默认的函数按理说称为构造方法才会更合理,当然如果是重新自定义(不同于类名)的称为构造方法就不合适了)会被覆盖,如果还需要默认的无参重载函数,请务必重新写代码。
具体实例如下:
Class.1cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Class1
{
// 定义Sugar方法
// 第一个使用string类型
public void Sugar(string tang)
{
if (tang == "榴莲糖")
Console.WriteLine("我最喜欢吃了!!!");
else
Console.WriteLine("滚你丫的!!!");
}
// 第二个使用int类型
public void Sugar(int count)
{
if (count > )
Console.WriteLine("吃糖太多对牙齿不好!!!");
else
Console.WriteLine("榴莲糖好好吃的呢!!!");
}
// 第三个数量不同
public void Sugar(string tang, int count)
{
if (tang == "榴莲糖")
Console.WriteLine("是不是很好吃呀,我还有哦!!!");
else if (tang != "榴莲糖" && count < )
Console.WriteLine("这个糖是不是不好吃,我有榴莲糖哦!!!");
else
Console.WriteLine("你吃糖太多了,不给了,除非榴莲糖.");
}
}
}
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)
{
// 使用类
Class1 myname = new Class1();
myname.Sugar("榴莲糖"); // 调用第一个方法
myname.Sugar(); // 使用第二个方法
myname.Sugar("牛奶糖", );
myname.Sugar("榴莲糖", );
myname.Sugar("大白兔奶糖", );
}
}
}
多态:
多态性相对于继承可以更进一步,就是派生类型的变量可以赋值给基本类型的变量。
例如:父类:Aminal、子类Dog
Aminal adog = new Dog();
adog.shout(); // 调用的是Dog.shout方法
C# 继承、虚方法、方法重载和多态的更多相关文章
- 3、二、c# 面向对像编程。类,结构、C# 数据类型(引用类型、值 类型、指针类型)、ref参数与out参数、方法的重载、静态类型与静态成员、继承与多态、委托与事件
一.类 定义类使用class关键字. <access specifier> class class_name { // member variables 成员变量 <access s ...
- 四. Java继承和多态3. 继承中的方法的覆盖和重载
在类继承中,子类可以修改从父类继承来的方法,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的名称.返回值类型.参数列表. 如果在新类中定义一个方法,其名称.返回值类型和参数列表正好与父类 ...
- Java 方法重载和多态
先来看看什么是方法重载? 方法重载的要求是:方法名相同,参数列表不同(不同的参数类型或者参数顺序或者参数个数).至于方法的其他部分,如方法返回值类型和修饰符,与方法重载没有任何关系.最好加上@Over ...
- C# 继承实现父类方法、重写、重载
继承是派生类(子类)去实现(重写<override>.重构<new>)基类(父类)的方法或属性.从而获取在派生类中要实现的功能. 子类调用父类构造方法,在父类中有个实现姓名和年 ...
- C#类的继承,方法的重载和覆写
在网易云课堂上看到唐大仕老师讲解的关于类的继承.方法的重载和覆写的一段代码,注释比较详细,在此记下以加深理解. 小总结: 1.类的继承:允许的实例化方式:Student t=new Student() ...
- JAVA中继承时方法的重载(overload)与重写/覆写(override)
JAVA继承时方法的重载(overload)与重写/覆写(override) 重载-Override 函数的方法参数个数或类型不一致,称为方法的重载. 从含义上说,只要求参数的个数或参数的类型不一致就 ...
- java方法的继承,覆盖与重载
java中的继承使用extends关键字,在子类继承了父类之后将会获得父类的全部属性与方法(父类的构造器除外).如果在定义java类时没有显示定义她的父类,那么这个类默认将扩展java.lang.Ob ...
- python面向对象-4类的继承与方法的重载
1.类的继承与方法的重载 上面就是先定义了一个类A,然后由定义了一个类B,B继承了类A,这样B就有了A的非私有属性和方法. class Washer: company='ZBL' def __init ...
- Java基础进阶:继承重点摘要,继承详解,方法重写注意事项,方法重载与重写的区别,抽象类,代码块, 附重难点,代码实现源码,课堂笔记,课后扩展及答案
继承重点摘要 *继承的特点: 子类在初始化之前,一定要先完成父类数据的初始化 子类在初始化之前,一定要先访问父类构造,完成父类数据的初始化 系统在每一个构造方法中默认隐藏了一句super(); 如果我 ...
- .NET 基础 一步步 一幕幕[面向对象之方法、方法的重载、方法的重写、方法的递归]
方法.方法的重载.方法的重写.方法的递归 方法: 将一堆代码进行重用的一种机制. 语法: [访问修饰符] 返回类型 <方法名>(参数列表){ 方法主体: } 返回值类型:如果不需要写返回值 ...
随机推荐
- windwos7 vnc连接centos6.6
一.先配置centos6.6的vnc(已经安装过桌面) #yum install fontforge -y 防止字体乱码 #yum tigervnc tigervnc-server -y ...
- mysql数据库负载均衡
负载均衡集群是有一组相互独立的计算机系统构成,通过常规网络或专用网络进行链接,有路由器衔接在一起,各个节点相互协作,共同负载.均衡压力,对客户端来说,整个群集可以视为一台具有超高性能的独立服务器. 实 ...
- python 一行代码字符串转字典方法
b = 'bid=Qzw9cKnyESM; ll="108288"; __yadk_uid=4YChvgeANLBEh4iV00n1tc0HQ8zpmSl1; __utmc=301 ...
- vue 路由跳转,路由传参的几种方式
1. router-link <router-link :to="{ path: 'yourPath', params: { name: 'name', dataObj: data } ...
- java杨辉三角和空心菱形(二维数组篇)
一.杨辉三角 import java.util.Scanner; //导入包 public class Test7 { public static void main(String[]args){ S ...
- grep命令相关用法
grep命令相关参数: -i:忽略大小写 --color:高亮显示匹配到的信息 -v:反向查找,没匹配到的行显示出来 -o:只显示被模式匹配到的串本身 正则表达式: .*:任意长度的任意字符,贪婪模式 ...
- 关系数据库(MySQL)的规范化、以及设计原则
1.了解范式(NF) 为了使得关系数据库能够符合规范理论,所有的数据库表都要满足:范式. 关系数据库的范式有五类:第一范式,第二范式,....第五范式.下面我们来了解一下前三个范式: 第一范式:简单来 ...
- SLES 12 sp2开启SuSEfirewall2 防火墙后,放行VRRP协议 (用于keepalived搭建高可用规则)
centos 6下面修改防火墙vi /etc/sysconfig/iptables 增加这个-A INPUT -p 112 -d 224.0.0.0/32 -j ACCEPT #-p 112指定协议为 ...
- [LeetCode&Python] Problem 21. Merge Two Sorted Lists
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...
- 服务器死机 导致 mongo 挂掉
1.删除mongod.lock和mongodb.log日志文件 2.携带参数重新启动 mongod --dbpath=/var/lib/mongo --port=27017 --fork --logp ...