封装
将方法细节隐藏,只留名字。
Public:所有对象都可以访问;
Private:对象本身在对象内部可以访问;
Protected:只有该类对象及其子类对象可以访问
Internal:同一个程序集的对象可以访问;
Protected internal:一个程序集内的对象,或者该类对象及其子类可以访问;
以上是常用的封装的特性修饰符;其作用主要是决定外部能否对这个封装(对象)进行操作;
继承
将已有的东西(方法,字段……)进行复制粘贴,减少代码量。
正式点讲就是 ,程序员不需要完全重新编写新的数据成员和成员函数,只需要设计一个新的类,继承了已有的类的成员即可。这个已有的类被称为的基类(父类),这个新的类被称为派生类(子类)。
号外
IS–A基于类继承或接口实现,IS-A是表达这句话的一种方式:“这个东西是那个东西的一种”。例如:野马是一种马。(是一个)
HAS-A关系是基于用法(即引用)而不是继承。换句话说,如果类A中的代码具有对类B实例的引用,则“类A HAS-A类B”。例如:马有缰绳。(有一个)“is-a”代表的是类之间的继承关系,比如PC机是计算机,工作站也是计算机。PC机和工作站是两种不同类型的计算机,但都继承了计算机的共同特性。因此在用Java语言实现时,应该将PC机和工作站定义成两种类,均继承计算机类。
“has -a”代表的是对象和它的成员的从属关系。同一种类的对象,通过它们的属性的不同值来区别。比如一台PC机的操作系统是Windows,另一台PC机的操作系统是Linux。操作系统是PC机的一个成员变量,根据这一成员变量的不同值,可以区分不同的PC机对象。
什么可以继承
类(只能一个),接口(可以多个,不好理解接口,就暂时理解成准备给很多类使用的抽象类)。
被sealed(密封)修饰符修饰的类是无法继承的。
多态
说实话,这个就是继承的实际用途了,实现动态多态;
实现的多态其实分为两种,一种是静态多态,种是动态多态;
静态多态
简单,就两种方式
- 方法的重载
class example
void print(int i)
{
Console.WriteLine("Printing int: {0}", i );
}
void print(double f)//**相同类;相同名字;不同参数;**
{
Console.WriteLine("Printing float: {0}" , f);
}
- 符号的重载
public static example operator+(example a,example b)
{
example c= new example();
c.length = b.length + c.length;
c.breadth = b.breadth + c.breadth;
c.height = b.height + c.height;
return box;
}
动态多态
关键字 :virtual(虚方法),abstract(抽象类),new(隐藏方法)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace shuclass
{
class A
{
public A()
{
Console.WriteLine("我是A类的无参构造函数");
}
public A(int i = 0)
{
Console.WriteLine("我是A类的第一个有参构造器");
Console.WriteLine(i);
}
public virtual void bad()
{
Console.WriteLine("baaaaaaaaaaaad");
}
public void yes()
{
Console.WriteLine("yeeeeeeeeeeeees");
}
}
class B : A
{
public B()
// : base(333)
{
Console.WriteLine("我是B类的构造函数");
}
public B(int i)
: base(i) //用:base(i)调用父类中的有参构造函数
{
Console.WriteLine("我是类B的第一个有参构造器");
}
public void Good()
{
Console.WriteLine("goo00000000000000000000000000d");
}
public override void bad()
{
base.bad();
Console.WriteLine("beeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed");
}
new public void yes()
{
Console.WriteLine("NOOOOOOOOOOOOOOOOO");
}
}
class Test
{
static void Main()
{
A b = new B();
b.bad();
b.yes();
// b.Good();//无法调用
Console.WriteLine(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
B b1 = new B(1);
b1.Good();
Console.WriteLine(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
Console.WriteLine(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
A a = new A();
A c = b1;
c.yes();
}
}
}
复制到console工程文件
F11试试看,花一个小时,相信你能理解的。