13.C#定义类成员
1.定义字段
class MyClass
{
public int MyInt;
}
字段可以⽤readonly修饰,表⽰该字段只能在构造函数中赋值,还可以⽤static表⽰该字段是静态字段
class MyClass
{
public int MyInt=17;//注意公共字段使⽤PascalCasing标准命名,即每个单词⾸字母⼤写
private int age=18; //私有变量⽤camelCasing标准命名,⾸字母⼩写,之后每个单词⾸字母⼤写
public int StaInt =13;
}
2.定义属性
class MyClass
{
private int myInt;
public int MyInt{
get{return myInt;}
protected set { myInt=value;}//set访问器只当前类和继承该类的⼦类能访问
} }
属性拥有两个类似函数的块,称为访问器,可以忽略其中⼀个访问器来创建只读或只写属性。访问器
可以拥有⾃⼰的访问修饰符,但访问性不能⾼于它所属的属性。属性可以⽤abstract、virtual、override修饰,但不能⽤于字段。
C#提供了⼀种定义属性的简写⽅式,可以不⽤定义私有字段,编译器会⾃动添加⼀个⽤于存储该属性的字段,但我们不知道该字段叫什么,⽆法直接对该字段进⾏修改。
public int MyInt { get; set; }
3.定义⽅法
class MyClass
{
public void GetString()
{
Console.WriteLine("AAAA");
}
}
⽅法可以⽤可访问修饰符public、protected、internal、private修饰,默认为private;⾮访问修饰符virtual、override、abstract、sealed、extern、static修饰,extern表⽰⽅法定义放在其他地⽅
4.隐藏基类⽅法
当基类的⽅法不像预期的那样⼯作时可以使⽤new关键字隐藏基类的⽅法,如
class Program
{
static void Main(string[] args)
{
MyClass a = new MyClass();
a.DoingSomething();//⼦类⽅法
MyBaseClass b = a;
b.DoingSomething();//基类⽅法
Console.ReadLine();
}
}
class MyBaseClass
{
public void DoingSomething()
{
Console.WriteLine("基类⽅法");
}
}
class MyClass : MyBaseClass
{
public new void DoingSomething()
{
Console.WriteLine("⼦类⽅法");
}
隐藏基类⽅法时,使⽤⼦类对象调⽤访问的是⼦类的⽅法,使⽤⽗类对象调⽤访问的是⽗类的⽅法,注意隐藏和重写的区别,重写时不管⽤⼦类还是⽗类对象调⽤⽅法,都将访问的是⼦类的⽅法(多态性),如下
class Program
{
static void Main(string[] args)
{
MyClass a = new MyClass();
a.DoingSomething();//⼦类⽅法
MyBaseClass b = a;
b.DoingSomething();//⼦类⽅法
Console.ReadLine();
}
}
class MyBaseClass
{
public virtual void DoingSomething()
{
Console.WriteLine("基类⽅法");
}
}
class MyClass : MyBaseClass
{
public override void DoingSomething()
{
Console.WriteLine("⼦类⽅法");
}
}
5.调⽤重写或隐藏的基类⽅法
有时候可能是在⽗类⽅法的基础上做修改,这样在重写⽅法时就需要调⽤⽗类的⽅法,可以使⽤base关键字调⽤重写的⽗类⽅法
class MyBaseClass
{
public virtual string DoingSomething()
{
return"⽗类⽅法";
}
}
class MyClass : MyBaseClass
{
public override string DoingSomething()
{
return base.DoingSomething()+ " ⼦类⽅法";
}
}
注:base代表的是⽗类的对象实例,所以不能在静态⽅法中调⽤
6.this 关键字
this关键字代表当前类的对象实例,可以使⽤this关键字访问当前对象的实例成员。和base⼀样this不能⽤在静态⽅法中
class MyClass
{
public void DoingSomething(object o)
{
this.WriteSomething(this);//⽤this调⽤成员⽅法,并把当前对象实例传给该⽅法
}
public void WriteSomething(MyClass c)
{
Console.WriteLine(c.ToString());
}
}writeline方法属于类
7.接⼝的实现
interface IMyInterface
{
void DoingSomething();
void DoingSomethingElse();
}
class MyClass : IMyInterface
public void DoingSomething()
{
}
public void DoingSomethingElse()
{
}
}
也可以在基类中实现接⼝成员,如
interface IMyInterface
{
void DoingSomething();
void DoingSomethingElse();
}
class MyBaseClass
{
public void DoingSomething()
{
}
}
class MyClass : MyBaseClass
{
public void DoingSomethingElse()
{
}
}
⽗类中实现了⽅法DoingSomething,⼦类只要实现剩余的⽅法即可
以上两种⽅法是隐式的实现接⼝,下⾯是显⽰实现接⼝的⽅法
interface IMyInterface
{
void DoingSomething();
void DoingSomethingElse();
}
class MyClass : IMyInterface
{
void IMyInterface.DoingSomethingElse()
{
}
void IMyInterface. DoingSomethingElse()
{
}
}
隐式实现接⼝和显式实现接⼝的区别在于:隐式实现接⼝需要⽤public修饰实现的成员,⽽显式实现的成员不能有访问修饰符修饰,并且需要⽤接⼝名.成员名限定实现的接⼝成员。
除了语法上的区别外,显式实现的接⼝成员只能通过接⼝访问,隐式实现的成员可以通过接⼝和类来访问。即
显式实现的接⼝成员只能⽤如下⽅式访问
IMyInterface b = new MyClass();
b.DoingSomething();
隐藏实现的可以这两种⽅式都可以
MyClass a = new MyClass();
a.DoingSomething();//⼦类⽅法
IMyInterface b = new MyClass();
b.DoingSomething();
8.嵌套类型的定义(内部类)
C#类内部不仅可以定义⽅法、变量等成员,也可以在类内部定义类,此时内部类不仅能使⽤public、internal关键字修饰,还可以使⽤private、protected修饰
public class MyClass
{
public class myNestedClass
{
public int nestedClassField;
}
public myNestedClass GetInternalClass()
{
return new myNestedClass();
}
}
如果内部类是public或者internal的就可以在MyClass类外部定义内部类的实例,但必须⽤限定名称
9.部分类
C#可以使⽤部分类定义,把类的定义放在多个⽂件中。如把字段、属性和构造函数放在⼀个⽂件,⽽把⽅法放在另⼀个⽂件。部分类定义对于⽤来隐藏窗⼝布局代码⾮常有⽤
public partial class MyClass
{
//类体
}
应⽤于部分类的接⼝会应⽤于整个类,下⾯两种⽅式是等价的
⽅式⼀:
public partial class MyClass:IMyInterface1
{
//类体
}
public partial class MyClass:IMyInterface2
{
//类体
}
⽅式2:
public class MyClass:IMyInterface1,IMyInterface2
{
//类体
}
10.部分⽅法
可以在部分类中定义部分⽅法,在⼀个部分类中定义部分⽅法,但不包含⽅法体,在另⼀个部分类中包含实现代码
public partial class MyClass
{
partial void MyPartialMethod();
}
public partial class MyClass
{
partial void MyPartialMethod()
{
}
}
部分⽅法可以是静态的,但是部分⽅法总是private,且不能有返回值,它们使⽤的参数也不能是out类型。因为部分⽅法如果没有⽅法体,编译器会完全删除该⽅法。如果⽅法有返回值,那么该⽅法就可以作为表达式的⼀部分,如
int a =Func(a,b)
如果Func是部分⽅法且没有⽅法体,那么编译器就不知道怎么执⾏上⼀句代码;同样如果输⼊参数是out类型,因为out类型的参数必须在⽅法体内赋值,如果没有⽅法体就会有问题。
分部⽅法不能具有访问修饰符或 virtual、abstract、override、new、sealed 或 extern 修饰符
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论