C#入门之定义类成员与接口实现
作者:springsnow 发布时间:2023-05-25 09:50:58
标签: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);//触发事件
}
}
来源:https://www.cnblogs.com/springsnow/p/9428487.html
0
投稿
猜你喜欢
- 关于隐藏和覆盖的区别,要提到RTTI(run-time type identification)(运行期类型检查),也就是运行期的多态,当一
- Java常用类库Math类Math包含用于执行基本数字运算的方法,例如基本指数,对数,平方根和三角函数一、Field SummaryModi
- 在上一篇笔记 《SpringMVC实现图片上传》记录了将图片上传到本地的实现,在很多项目中都会有一台专门的文件服务器来保存文件的,这边记录下
- 本文适合有 Java 基础的人群作者:DJL-LankingHelloGitHub 推出的《讲解开源项目》系列。有幸邀请到了亚马逊 + Ap
- Web Services 可以将应用程序转换为网络应用程序。通过使用 Web Services,您的应用程序可以向全世界发布信息,或提供某项
- c#创建圆形类,其中包括set,get方法using System;using System.Collections.Generic;usi
- 归并排序里运用到算法里很重要的一个思想——分治法:将原问题分解为几个规模较小但类似于原问题的子问题——《算法导论》。在每一层递归中都有3个步
- 介绍原型模式(Prototype Pattern):使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种对象创建
- IDE工具之IDEA2022.2的简介、下载与安装、初步配置IDEA简介概述IDEA全称是IntelliJ,是JetBrains公司推出一个
- 本篇随笔主要介绍用Java实现简单的装饰器设计模式:先来看一下装饰器设计模式的类图:从图中可以看到,我们可以装饰Component接口的任何
- 目录一、服务的概念二、Android的多线程编程2.1 线程的基本用法2.2 在子线程中更新UI更新方式一更新方式二2.3 解析异步消息处理
- 第一步:下载需要添加的jar包可以在maven库中查找下载,也可以在对应官网下载maven库网址:https://mvnrepository
- 最近碰到个需要下载zip压缩包的需求,于是我在网上找了下别人写好的zip工具类。但找了好多篇博客,总是发现有bug。因此就自己来写了个工具类
- 记得在thinkphp框架中,模型名会自动转换为对应下划线的表名,如,UserType 自动转化为user_type,在平时写程序中很多地方
- Long end,long num,File file,String charset4个参数说明end 相当于坐标 ,tail 向上的起点,
- 本文为大家分享了java画出五子棋游戏棋盘的方法,供大家参考,具体内容如下棋盘模块:画五子棋棋盘:19条横线、19条竖线步骤一:显示棋盘我有
- 一般文本文件我们以日志文件.log文件为例:import java.io.BufferedReader; import java.io.Fi
- SpringCloud Zuul 是SpringCloud系列的网关实现,具有均衡负载,将非业务性校验剥离出来,使微服务专注于业务的一个组件
- 一、前沿如果你学习过其他的编程语言,你就会发现 Java 的语法很是哆嗦,可是我们为什么没有放弃 Java 这门编程语言呢?因为 JVM 是
- C#中对象,字符串,dataTable、DataReader、DataSet,对象集合转换成Json字符串方法。public class C