C#入门之定义类成员与接口实现
作者:springsnow
这篇文章介绍了C#入门之定义类成员与接口实现,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
一、类成员的访问级别
- public:可由任何代码访问。
- private(默认):只能由类中的代码访问。
- internal:只能由它所在的项目(程序集)内部代码访问。
- protected:只能由类和其派生类访问。
- protected internal:只能由它所在的项目(程序集)或派生类的代码访问。
二、定义字段
class MyClass { public int MyInt;//公共字段 int myInt;//私有字段 public readonly int MyInt2 = 17;//只读成员,只能在声明时赋值或在构造函数中赋值。 public static int myInt3;//静态字段,通过类访问。作用:1、记录一实例化对象的个数,2、存储必须在所有实例间共享的值。 public const float PI = 3.14F;//常量,编译时就固定,一旦发生更改,需要重新编译,必须且只有在声明时初始化。 }
三、定义方法
方法的继承修饰符:
- virtual:方法可以重写。
- abstract:方法必须重写,只用于抽象类。
- override:重写一个基类方法。可以和sealed一起使用,应用在方法或属性,表示不能进一步的重写了。
- extern:代码放于项目外,仅用于静态[DllImport]表示的方法。
- static:方法只能通过类访问。静态方法和属性不能访问其基类的非静态成员,不能访问任何对象的实例变量。静态成员可继承。
- new :隐藏基类成员。
void Main() { A b1 = new B();//多态 b1.M();//BM B b2 = new B(); b2.M();//BM } abstract class A { public virtual void M()//虚拟方法,可继承 { Console.Write("AM"); } } class B : A { public override void M()// 重写了基类方法M { Console.Write("BM"); } }
无论基类是否为虚拟,派生类都可以用new 来隐藏。不覆盖基类方法,不影响基类的方法。可以用base.M()方式访问基类成员。
void Main() { A b1 = new B(); b1.M();//AM B b2 = new B(); b2.M();//BM } abstract class A { public virtual void M()//虚拟方法,可继承 { Console.Write("AM"); } } class B : A { public new void M()// 重写了基类方法M { Console.Write("BM"); } }
四、定义属性
属性的继承修饰符:virtual,abstract,override.
- 只读属性:不顶用其中的get、set方即可。
- 只写属性:用private修饰符对get、set方法进行保护。
public class A { private int intVal; public int Val { get { return intVal; } set { if (value >= 0 && value <= 10) intVla = value; else throw new Exception("XX"); } } }
五、接口实现
实现接口的类必须实现所有接口成员,且匹配指定的签名。接口成员默认是公共的。
若要实现接口成员,类中对应的成员必须是公共的,非静态的,并且与接口成员集邮相同的名称和签名。
interface IMyInterface //定义接口 { int DoSth();//定义方法 int IMyInt { set; get; }//定义属性 event EventHandler Event;//定义事件 string this[int index] { get; set; } //定义索引器 } class MyClass : IMyInterface { private int _x; int IMyInterface.DoSth() //显示接口实现 { return _x; } public int IMyInt//隐式接口实现 { get { return _x; } set { _x = value; } } public event EventHandler Event; protected void onEvent() { if (Event == null) { Event(this, EventArgs.Empty); } } public string this[int index] { get { return _x.ToString(); } set { _x = int.Parse(value); } } }
1、显示接口实现,只能通过接口访问:
MyInterface myClass=new MyClass(); myClass.DoSth();
2、隐式接口实现,既可通过类,也可通过接口访问。
MyClass myClass=new MyClass(); myClass.DoSth();
六、定义索引器
索引器indexer是一种特殊类型的属性。添加到类中,以提供类似于数组的访问。
void Main() { MyClass myClass = new MyClass(); myClass[0] = "d"; Console.Write(myClass[0]);//d Console.Write(myClass[2]);//c } public class MyClass { private string[] arr = { "a", "b", "c" }; public string this[int index] { get { return arr[index]; }//只有get,无set的索引为只读索引 set { arr[index] = value; } } }
七、运算符重载
void Main() { MyClass myClass1 = new MyClass(500); MyClass myClass2 = new MyClass(200); Console.Write(myClass1 - myClass2);//300 } public class MyClass { decimal weight; public MyClass(decimal weight) { this.weight = weight; } public static decimal operator -(MyClass a, MyClass b) { return a.weight - b.weight; } }
八、定义事件
void Main() { MyClass myClass1 = new MyClass(); myClass1.myEvent += (sender, args) => { Console.Write(sender); }; myClass1.TriggerEvent();//MyClass } public class MyClass { public event EventHandler<EventArgs> myEvent;//定义事件 public void TriggerEvent() { EventHandler<EventArgs> temp = myEvent; if (temp != null) temp(this, EventArgs.Empty);//触发事件 } }
到此这篇关于C#入门之定义类成员与接口实现的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。