using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
/*
* C#三大特性
* 封装:
* 就是吧一个对象所能操作的所有信息放在一起;这样的方法包含在类中,通过类的实例来实现;
* 作用:
* 1.良好的封装能够减少耦合(比如实现界面和逻辑分离);
* 2.可以让类对外接口不变,内部可以实现自由的修改;
* 3.类具有清晰的对外接口,使用者只需要调用,无需关心内部;
* 4.因为封装的类功能相对独立,因此能更好的实现代码复用;
* 5.可保护代码不被无意中破坏,通过私有字段等实现内部,注意:这里的代码保护不是指代码本身的加密,而是对不想外部更改的代码通过私有实现;
* 继承:
* 在现有类(基类、父类)上建立新类(派生类、子类)的处理过程为继承;从父辈身上继承点特征;
* 被继承的类为基类(父类),继承的类为派生类(子类),派生类能自动获取基类(除了构造函数和析构函数和(私有成员)的所有成员),可以在派生类中添加新的属性和方法扩展其功能;
* 作用:
* 如果子类属性和父类有一些不一样,那么就不用再费劲见一个新类,可以直接在父类基础上修改就行了,免去了很多操作,不用重复定义类;
* 语法:
* 子类:父类
* 一个子类只能有一个父类(只能继承一个类)
* protected 修饰符(受保护的,只有当前类的成员与继承该类的类 才能访问)
* 多态:
* 同一操作作用于不同的对象可以有不同的解释,产生不同的执行效果;
* 多态的表达方式:
* 1.使用新的派生成员替换基成员:
* 如果基类定义了一个方法、字段或属性,则new关键字用于在派生类中创建该方法、字段或属性的新定义;new关键字放置在要替换的类成员的返回类型之前,调用的是新的类成员而不是已被替换的基类成员,这些基类成员成为隐藏成员;如果将派生类的实例强制转换成基类的实例,就仍然可以调用隐藏类成员;
* 2.虚拟的基成员:
* 重写:父类中的方法,属性用virtual修饰;子类中对应override修饰
* 注意:
* 1.字段不能是虚拟的,只有方法、属性、事件和索引器才可以是虚拟的;
* 2.子类重写某个虚拟成员时,即使该子类的实例被当作基类的实例访问,也会调用子类的成员;
* 3.无论在子类和最初声明虚拟成员的类之间已声明了多少个类,虚拟成员都将永远为虚拟成员;如果类A声明了一个虚拟成员,类B从A派生,类C从类B派生,则类C继承该虚拟成员,并且可以选择重写它,而不管类B是否为该成员声明了重写;
* 4.派生类可以通过将重写声明为密封的来停止虚拟继承,这需要在类成员声明中将sealed关键字方法override关键字的前面;
* 3.base:可以调用父类的成员方法,除了构造函数和析构函数,派生类将隐式继承了直接基类的所有成员,也可以显示得而调用父类的构造函数来构造子类的成员数据(引申this)
*
*/
namespace ConsoleApplication8
{
class Program
{
static void Main(string[] args)
{
#region
//BlackCat blackCat = new BlackCat();
//blackCat.Run();
//Console.WriteLine(blackCat.Size);
//Console.WriteLine(blackCat.name);
#endregion
#region
//Mosquito mosquito = new Mosquito();
//Console.WriteLine("蚊子大小=" + mosquito.Size());
//Insect insect = new Insect();
//Console.WriteLine("昆虫大小=" + insect.size);
#endregion
Insect insect = new Mosquito();//父类调用子类的
insect.Bite();
Console.WriteLine("昆虫大小=" + insect.size);
Insect insect1 = new Ant();
insect1.Bite();
Console.ReadKey();
}
}
#region
//class Monitor//简单的封装
//{
// private string brand;//品牌
// public string Brand
// {
// get { return brand; }
// }
// public string color;//颜色
// private int size;//尺寸
// public int Size
// {
// get { return size; }
// }
// void Show()//显示
// {
// }
//}
#endregion
#region
//猫类
class Cat
{
public Cat()
{
Console.WriteLine("我是猫");
}
public Cat(int age)//有参的不能被读取
{
Console.WriteLine("我是猫,我今年{0}岁");
}
~Cat()
{
}
public string name = "Tom";
private int size = 10;
public int Size
{
get { return size; }
}
public void Run()
{
Console.WriteLine("我在跑");
}
}
//黑猫类
class BlackCat : Cat//继承语法 子类:父类
{
public BlackCat()
{
Console.WriteLine("我是黑猫");
}
}
#endregion
#region
昆虫类
//class Insect
//{
// public int size = 10;
// public void Bite()
// {
// }
//}
蚊子类
//class Mosquito : Insect
//{
// public new int size = 20;
// public int Size()
// {
// return size;
// }
//}
蚂蚁类
//class Ant : Insect
//{
//}
#endregion
//昆虫类
class Insect
{
public int size = 10;
public virtual void Bite()//virtual可以被子类重写,不能写在字段里面
{
//加上virtual可以说成是一个虚函数
Console.WriteLine("我不知道怎么咬人");
}
}
//蚊子类
class Mosquito : Insect
{
public override void Bite()
{
size = 20;
Console.WriteLine("我会叮人");
}
}
//蚂蚁类
class Ant : Insect
{
public sealed override void Bite()//override前面加上sealed是不能被重写的
{
Console.WriteLine("我会咬人");
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
/*
* C#三大特性
* 封装:
* 就是吧一个对象所能操作的所有信息放在一起;这样的方法包含在类中,通过类的实例来实现;
* 作用:
* 1.良好的封装能够减少耦合(比如实现界面和逻辑分离);
* 2.可以让类对外接口不变,内部可以实现自由的修改;
* 3.类具有清晰的对外接口,使用者只需要调用,无需关心内部;
* 4.因为封装的类功能相对独立,因此能更好的实现代码复用;
* 5.可保护代码不被无意中破坏,通过私有字段等实现内部,注意:这里的代码保护不是指代码本身的加密,而是对不想外部更改的代码通过私有实现;
* 继承:
* 在现有类(基类、父类)上建立新类(派生类、子类)的处理过程为继承;从父辈身上继承点特征;
* 被继承的类为基类(父类),继承的类为派生类(子类),派生类能自动获取基类(除了构造函数和析构函数和(私有成员)的所有成员),可以在派生类中添加新的属性和方法扩展其功能;
* 作用:
* 如果子类属性和父类有一些不一样,那么就不用再费劲见一个新类,可以直接在父类基础上修改就行了,免去了很多操作,不用重复定义类;
* 语法:
* 子类:父类
* 一个子类只能有一个父类(只能继承一个类)
* protected 修饰符(受保护的,只有当前类的成员与继承该类的类 才能访问)
* 多态:
* 同一操作作用于不同的对象可以有不同的解释,产生不同的执行效果;
* 多态的表达方式:
* 1.使用新的派生成员替换基成员:
* 如果基类定义了一个方法、字段或属性,则new关键字用于在派生类中创建该方法、字段或属性的新定义;new关键字放置在要替换的类成员的返回类型之前,调用的是新的类成员而不是已被替换的基类成员,这些基类成员成为隐藏成员;如果将派生类的实例强制转换成基类的实例,就仍然可以调用隐藏类成员;
* 2.虚拟的基成员:
* 重写:父类中的方法,属性用virtual修饰;子类中对应override修饰
* 注意:
* 1.字段不能是虚拟的,只有方法、属性、事件和索引器才可以是虚拟的;
* 2.子类重写某个虚拟成员时,即使该子类的实例被当作基类的实例访问,也会调用子类的成员;
* 3.无论在子类和最初声明虚拟成员的类之间已声明了多少个类,虚拟成员都将永远为虚拟成员;如果类A声明了一个虚拟成员,类B从A派生,类C从类B派生,则类C继承该虚拟成员,并且可以选择重写它,而不管类B是否为该成员声明了重写;
* 4.派生类可以通过将重写声明为密封的来停止虚拟继承,这需要在类成员声明中将sealed关键字方法override关键字的前面;
* 3.base:可以调用父类的成员方法,除了构造函数和析构函数,派生类将隐式继承了直接基类的所有成员,也可以显示得而调用父类的构造函数来构造子类的成员数据(引申this)
*
*/
namespace ConsoleApplication8
{
class Program
{
static void Main(string[] args)
{
#region
//BlackCat blackCat = new BlackCat();
//blackCat.Run();
//Console.WriteLine(blackCat.Size);
//Console.WriteLine(blackCat.name);
#endregion
#region
//Mosquito mosquito = new Mosquito();
//Console.WriteLine("蚊子大小=" + mosquito.Size());
//Insect insect = new Insect();
//Console.WriteLine("昆虫大小=" + insect.size);
#endregion
Insect insect = new Mosquito();//父类调用子类的
insect.Bite();
Console.WriteLine("昆虫大小=" + insect.size);
Insect insect1 = new Ant();
insect1.Bite();
Console.ReadKey();
}
}
#region
//class Monitor//简单的封装
//{
// private string brand;//品牌
// public string Brand
// {
// get { return brand; }
// }
// public string color;//颜色
// private int size;//尺寸
// public int Size
// {
// get { return size; }
// }
// void Show()//显示
// {
// }
//}
#endregion
#region
//猫类
class Cat
{
public Cat()
{
Console.WriteLine("我是猫");
}
public Cat(int age)//有参的不能被读取
{
Console.WriteLine("我是猫,我今年{0}岁");
}
~Cat()
{
}
public string name = "Tom";
private int size = 10;
public int Size
{
get { return size; }
}
public void Run()
{
Console.WriteLine("我在跑");
}
}
//黑猫类
class BlackCat : Cat//继承语法 子类:父类
{
public BlackCat()
{
Console.WriteLine("我是黑猫");
}
}
#endregion
#region
昆虫类
//class Insect
//{
// public int size = 10;
// public void Bite()
// {
// }
//}
蚊子类
//class Mosquito : Insect
//{
// public new int size = 20;
// public int Size()
// {
// return size;
// }
//}
蚂蚁类
//class Ant : Insect
//{
//}
#endregion
//昆虫类
class Insect
{
public int size = 10;
public virtual void Bite()//virtual可以被子类重写,不能写在字段里面
{
//加上virtual可以说成是一个虚函数
Console.WriteLine("我不知道怎么咬人");
}
}
//蚊子类
class Mosquito : Insect
{
public override void Bite()
{
size = 20;
Console.WriteLine("我会叮人");
}
}
//蚂蚁类
class Ant : Insect
{
public sealed override void Bite()//override前面加上sealed是不能被重写的
{
Console.WriteLine("我会咬人");
}
}
}