接口(Interface):
C#中接口定义的规则:
1、接口本身的默认访问级别为internal,即程序集本身访问级别
2、接口中方法不能使用任何访问修饰符(例如 public private internal protected)等修饰。(系统自动为其设置为public)
3、不能使用virtual修饰
4、接口不能包含字段,无论是常量,还是实例字段,还是static字段,都不能包含。(字段本质上是类实现的一个方面,而接口不能包含任何实现细节)
5、接口不能包含构造函数(构造函数也被认为是一种类的实现细节,与接口不包含任何实现冲突)
6、接口不能包含析构函数
7、接口中不能嵌套任何类型,无论是接口、类,还是结构、枚举等类型。
interface IComparable
{
/*
* 接口不能包含字段,无论是常量,还是实例字段,还是static字段,都不能包含。
public const int ID = 100;Error
*/
/*
* 接口中方法不能使用任何访问修饰符(例如 public private internal protected)等修饰。(系统自动为其设置为public)
* public int CompareTo(Object obj);
*/
/*
* 不能使用virtual修饰(编译器自动为其设置为public)
* virtual int CompareTo(Object obj);
*/
int CompareTo(Object obj);
void PrintMsg();
/*
* 接口中属性不能使用任何访问修饰符(例如 public private internal protected)等修饰。(系统自动为其设置为public)
* public String Name { get; }属性本身类似方法,所以规则相同
*/
String Name { get; }
}
实现的类:
class Info:Lesson2.IComparable
{
//显示实现接口方法时,不能添加任何访问修饰符.即是private的,所以不可见,只能通过接口实例才能访问这种方法。
//显示实现接口方法主要用于实现多个接口,而这些接口有可能存在同名方法时使用(区别不同的接口方法)
int IComparable.CompareTo(object obj)
{
return 0;
}
//非显示实现接口方法时,访问级别必须是public(即子类方法覆盖父类或实现接口时不能降低访问级别)
public string Name
{
get { return "信息"; }
set { Console.WriteLine("设置信息"); }//尽管接口没提供set;子类仍然可是添加set;
}
//非显示实现接口方法时,访问级别必须是public(即子类方法覆盖父类或实现接口时不能降低访问级别)
//可以把此方法声明为virtual,以便子类覆写
public virtual void PrintMsg()
{
Console.WriteLine("你好,嘿嘿!");
}
}
使用:
Info info = new Info();
info.Name = "";
Console.WriteLine(info.Name);
//调用显示实现的接口方法时,不能使用类实例,而要使用接口引用
IComparable cp = info;
Console.WriteLine(cp.CompareTo(1));//打印0
//由于printMsg方法不是通过显示接口实现的,所以可以通过实例引用调用,也可通过接口引用调用(多态)
info.PrintMsg();//实例引用调用
cp.PrintMsg();//接口引用调用
Console.WriteLine(cp.Name);//接口引用调用属性
抽象类:
//抽象类
abstract class abstractClass
{
//静态构造函数,类似Java的静态初始化块,不能使用任何访问修饰符,也不能有参数
static abstractClass()
{
Console.WriteLine("抽选类abstractClass的静态构造函数");
}
public abstractClass()
{
Console.WriteLine("抽选类abstractClass的构造函数");
}
public abstractClass(String msg)
{
Console.WriteLine("抽象类 abstractClass 的重载构造函数abstractClass(String msg)");
}
public void Hi()
{
Console.WriteLine("实例方法 Hi()!");
}
public static void Say()
{
Console.WriteLine("静态方法 Say()");
}
/*
* 构造函数不能是抽象的
public abstract abstractClass(int i);
*/
/*
* 静态方法不能标记为virtual、 abstract、 override
public abstract static void Say(int i);
*/
public abstract void printMsg(String msg);
}
//实现抽象类
class subClass : abstractClass
{
//静态构造函数,类似Java的静态初始化块,不能使用任何访问修饰符,也不能有参数
//C#中静态构造函数调用顺序和Java不一样,C#是先调用本类的静态构造函数,再调用父类的静态构造函数。Java相反.
static subClass()
{
Console.WriteLine("subClass静态初始化块!");
}
public subClass(): base("我日!")
{
Console.WriteLine("subClass 构造函数!");
}
//抽象方法必须以override方式实现,与实现接口有点儿不一样
public override void printMsg(string msg)
{
Console.WriteLine("printMsg打印的信息是:{0}",msg);
}
}
使用:
//抽象类使用
subClass sub = new subClass();
abstractClass.Say();//抽象类调用静态方法
subClass.Say();//实现抽象类子类调用静态方法(继承的静态方法)
abstractClass subabc = sub;
sub.printMsg("568");
subabc.printMsg("123");