一、抽象方法
抽象方法是一种特殊的虚方法,它只起声明作用,所以只加“ ; ”号,一定不能带实现。用抽象方法就是因为在类中可以不用实现的时候,没必要写一个虚方法。
抽象方法要用abstract修饰。访问修饰符不能用private!
二、抽象类
有抽象方法的类一定是在抽象类中。但是在抽象类中不一定要有抽象方法。同样的也是用abstract修饰符。
抽象类不能被实例化。
抽象类可以写虚方法,可以写方法,可以写构造方法,抽象类的虚方法还可以调用抽象方法,不会报错,主要是不能被实例化,其它与普通类没有大的区别。
被继承的具体类一定要实现抽象类中所有的抽象方法。所以这句话的另一层含义就是如果继承一个抽象类A的还是一个抽象类B,那么抽象类B可以实现父类A中的抽象方法,也可以不实现父类A中的抽象方法。但是最终还是有一个具体类实现它父类中所以没有被实现的抽象方法。
抽象方法和虚方法的区别:
1、抽象方法一定不能有实现,写的时候就只有一个声明,而虚方法一定要有实现,也就是要有写的方法体。
2、抽象方法被具体类继承后一定要重写,但是虚方法可以不用重写。
3、抽象方法是一种特殊的虚方法,如果一个类要有抽象方法,那么它一定是抽象类,所以抽象方法必须是在抽象类中才能写的。而虚方法没有类的要求。
public abstract class Test1
{
//抽象方法
public abstract void Function1();
}
public abstract class Test2 : Test1
{
public override void Function1 ()
{
Console.WriteLine ("2");
}
public abstract void Function2 ();
}
public class Test3 : Test2
{
public override void Function1 ()
{
base.Function1 ();
}
public override void Function2 ()
{
Console.WriteLine ("3");
}
}
三、抽象属性
public override string Brand { //实现
get {
return brand;
}
set {
brand = value;
}
}
public override void Play ()
{
Console.WriteLine ("play basketball");
}
public override void Size ()
{
Console.WriteLine ("medium");
}
public override void HowToPlay ()
{
Console.WriteLine ("by hands");
}
}
public class Soccer : Ball
{
public override string Brand { //实现
get {
return brand;
}
set {
brand = value;
}
}
public override void Play ()
{
Console.WriteLine ("play soccer");
}
public override void Size ()
{
Console.WriteLine ("medium");
}
public override void HowToPlay ()
{
Console.WriteLine ("by foot");
}
public void Play (int a) { //重载
}
}
}
如果抽象属性只有set那么属性的实现也只能有set,不能写get,相应的只有get也是一样的。
四、静态成员
用static修饰的成员称为静态成员。
静态成员只能由类来调用。普通的方法和字段是对象来调用的。
静态字段被类的所有实例共享,只有一个,指向同一位置。静态成员在没有类的对象创立时,也可以访问。
namespace Test
{
class MyClass
{
static void Main(string[] args)
{
Solution solution = new Solution();
Solution.a2 = 0;
solution.a1 = 1;
}
}
public class Solution
{
public int a1;
public static int a2;
}
}
五、静态属性
- 不能访问类的实例成员,但它们能被实例成员访问。
- 不管类是否有实例,它们都存在
- 当从类的外部访问是必须使用类名引用,而不是实例名。
using System;
namespace Test
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Init value: {0}", Trial.MyValue);
Trial.MyValue = 10;
Console.WriteLine("New value: {0}", Trial.MyValue);
Trial trial = new Trial();
trial.PrintValue();
}
}
public class Trial
{
public static int MyValue { get; set; }
public void PrintValue()
{
Console.WriteLine("value from inside:{0}", MyValue);
}
}
}
结果:
Init value: 0
New value: 10
value from inside:10
六、静态类
静态类不能实例化,不包含非静态成员,不能被继承。可以把静态类看做一个工具类,它不需要实例,只要需要,都可以调用该类成员。
静态类的特点:
1、仅包含静态成员和const修饰的常量
2、不能被实例化
3、是密封的(默认sealed,不能再用sealed修饰),也就是说不能被继承
4、有静态构造方法,但静态构造方法必须是无参数的
七、静态构造方法
静态构造方法用于初始化静态数据,或用于执行仅需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造方法。
不能带访问修饰符,不能带参数,不能重载!
八、单例设计模式
单例设计模式就是确保一个类只有一个实例。之所以要单例模式是因为单例模式是资源管理的必备模式,保证一个类只有一个实例,并且这个实例易于被访问。减少了new对象,一般用在通用工具类上,如果不适合用单例就不用,管理会变得复杂。
单例简单设计模式的关键是:
1、建立私有静态实例
2、私有构造方法
3、公有静态属性
其余和普通类一样