继承
类1:类2 类1中继承了类2中的元素
派生类和基类
类1是派生类, 类2是基类
方法的重写
基类中virtual,派生类中override,对基类成员进行覆盖
抽象类
不能被实例化,只能被继承,关键词abstract
一个类继承了抽象类,就必须实现抽象类中的所有的抽象方法。
抽象类:抽象类往往用来表征对问题领域复进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。抽象类是不完整的,它只能用作基类。
在面向对象方法中,抽象类主要用来进行类型隐藏和充当全局变量的角色。
class Program
{
static void Main(string[] args)
{
Man man = new Man();
man.Eat();
man.Say();
}
}
public abstract class People
{
//注意:如果类中有抽象方法,则类必须声明为抽象类。
public People()
{
Console.WriteLine("父类的构造函数");
}
public abstract void Eat();
//有时候不想把类声明为抽象类,但又想实现方法在基类里不具体实现,
//而是想实现方法由派生类重写。遇到这种情况时可使用virtual关键字将方法声明为虚方法
public virtual void Say()
{
//注意虚方法必须声明方法主体,抽象方法则不需要
Console.WriteLine("我是父类的虚方法");
}
}
class Man:People
{
public Man()
{
Console.WriteLine("子类构造函数");
}
public override void Eat()
{
Console.WriteLine("子类eat");
}
public override void Say()
{
Console.WriteLine("子类Say");
}
}
私有构造函数
用于阻止创建类的实例,没其他鸟用
public class Counter
{
private Counter() { }
public static int currentCount;
public static int IncrementCount()
{
return ++currentCount;
}
}
class TestCounter
{
static void Main()
{
// If you uncomment the following statement, it will generate
// an error because the constructor is inaccessible:
// Counter aCounter = new Counter(); // Error
Counter.currentCount = 100;
Counter.IncrementCount();
Console.WriteLine("New count: {0}", Counter.currentCount);
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
// Output: New count: 101
Protect关键字
protected类型成员能够被派生类所继承
并且只能够通过派生类类型访问,而不能通过基类访问
属性
保护字段,对字段取值与赋值进行限定
private string name;
public string Name
{
get { return name; }
set
{
name = String.IsNullOrEmpty(value) ? "空" : value;
}
}
成员
C#中,类的成员有两个分类:
1).数据成员:常量、字段(静态字段,实例字段)
2).函数成员:属性、方法、嵌套类、索引答器、事件、运算符、实例构造函数、析构函数、静态构造函数
static关键字
静态成员函数与类相联系,不与类的对象相联系
class Program
{
public static int i = 0;
public Program()
{
i = 1;
Console.WriteLine("实例构造方法被调用");
}
static Program()
{
i = 2;
Console.WriteLine("静态构造函数被执行");
}
static void Main(string[] args)
{
Console.WriteLine(i);//结果为2,首先,类被加载,所有的静态成员被创建在静态存储区,i=0,接着调用了类的成员,这时候静态构造函数就会被调用,i=2
Program p = new Program();
Console.WriteLine(i);//结果为1,实力化后,调用了实例构造函数,i=1,因为静态构造函数只执行一次,所以不会再执行。
Console.ReadKey();
}
}
可变参数
可以在方法参数栏加params属性 接受一个一维数组的可变参数
public void test1(params string[] list)
{
for (int i = 0; i < list.Length; i++)
Console.WriteLine(list[i])
}
引用传递
调用方法时,在方法中对参数所做的任何更改都反应在该变量中。
使用ref参数 必须方法声明 和调用方都必须显示的使用 ref关键字
int i = 3;
Console.WriteLine(i);
g.test2(ref i);
Console.WriteLine(i);
public void test2(ref int i)
{i = 55;}
参数通过引用来传递。ref要求变量必须在传递前初始化。而out参数不用初始化。必须声明和调用方都显示使用 out
int value;
g.test3(out value);
public void test3(out int i)
{i = 66;}
接口与抽象类的区别
抽象类是一个不完全的类,类里面有抽象的方法,属性,也可以有具体的方法和属性,需要进一步的专业化。但接口是一个行为的规范,里面的所有东西都是抽象的!一个类只可以继承一个基类也就是父类,但可以实现多个接口