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>10&&value<23)
_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 = 15;
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 > 3)
Console.WriteLine("吃糖太多对⽛齿不好");
else
Console.WriteLine("榴莲糖好好吃的呢");
}
// 第三个数量不同
public void Sugar(string tang, int count)
{
if (tang == "榴莲糖")
Console.WriteLine("是不是很好吃呀,我还有哦");
else if (tang != "榴莲糖" && count < 3)
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(1); // 使⽤第⼆个⽅法
myname.Sugar("⽜奶糖", 2);
myname.Sugar("榴莲糖", 10);
myname.Sugar("⼤⽩兔奶糖", 12);
}
}
}
多态:writeline方法属于类
多态性相对于继承可以更进⼀步,就是派⽣类型的变量可以赋值给基本类型的变量。例如:⽗类:Aminal、⼦类Dog
Aminal adog = new Dog();
adog.shout(); // 调⽤的是Dog.shout⽅法
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论