文档章节

定义类成员(属性、方法、索引、运算符、事件)、接口实现

o
 osc_pn11u1x9
发布于 2018/08/06 09:23
字数 997
阅读 12
收藏 0

精选30+云产品,助力企业轻松上云!>>>

一、类成员的访问级别

  • 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);//触发事件
    }
}
o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
明明白白学C#

明明白白学C# 试读文档下载: 第五章地址:http://pan.baidu.com/s/1bnnMAGv 第六章地址:http://pan.baidu.com/s/1bnD5cBH 前言 C#语言是微软推出的一种面向对象程序开发语言。作为微软的主...

大学霸
2014/10/27
208
0
lua&C#学习整理

1.Lua中有8个基本类型分别为:nil、boolean、number、string、userdata、function、thread和table。 2.pairs 和 ipairs区别 pairs: 迭代 table,可以遍历表中所有的 key 可以返回 nil ipairs...

osc_o18rkfva
2018/02/22
0
0
解读经典《C#高级编程》第七版 Page68-79.对象和类型.Chapter3

前言 新年好,本篇开始进入第三章,《对象和类型》,深刻理解C#的对象,对于使用好.Net类库非常重要。 01 类和结构 从使用角度看,结构和类的区别很小,比如,将结构定义转换为类,只需要将关...

osc_ui6dytbk
2019/01/10
2
0
C#基础知识点梳理二

上次我们讲的是一些C#前面的基础知识,一些比较重要的索引委托事件接口泛型将会接下来慢慢讲解,这也是一个自我复习的过程,嗯对,就是这样的。 先来 深入理解类,掌握一些类的使用方法和特性...

osc_q9huomuf
2018/07/10
0
0
标识符与关键字

c#中的关键字 关键字是对编译器具有特殊意义的预定义保留标识符。它们不能在程序中用作标识符,除非它们有一个 @ 前缀。例如,@if 是有效的标识符,但 if 不是,因为 if 是关键字。 下面是列...

osc_ft59t5i9
2018/06/16
2
0

没有更多内容

加载失败,请刷新页面

加载更多

设计模式(4) 建造者模式

什么是建造者模式 经典建造者模式的优缺点 对建造者模式的扩展 什么是建造者模式 建造者模式将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。创建者模式隐藏了...

zhixin9001
9分钟前
14
0
ArrayList源码分析 —— JDK8

ArrayList的特性 ArrayList内部使用数据作为存储结构,ArrayList可以理解为数组的扩展对象,封装了常用的和非常用的操作数组的方法。以及当数组长度不足以保存数组时,自动扩容数组,通常Arr...

XuePeng77
16分钟前
10
0
__slots__的用法? - Usage of __slots__?

问题: Python中__slots__的目的是什么-尤其是关于何时以及何时不使用它的目的? 解决方案: 参考一: https://stackoom.com/question/1ymu/slots-的用法 参考二: https://oldbug.net/q/1ym...

富含淀粉
27分钟前
17
0
Python分析42年高考数据,告诉你高考为什么这么难?

作者:徐麟 历年录取率 可能很多经历过高考的人都不知道高考的全称,高考实际上是普通高等学校招生全国统一考试的简称。从1977年国家恢复高考制度至今,高考经历了许多的改革,其中最为显著的...

爱码小哥
28分钟前
19
0
CKEditor 5 + SpringBoot实战(四):SpringBoot 实现文件上传

在本系列的文章中,我将介绍如何在Spring Boot Application中使用CKEditor编辑器。介绍的内容包括基本环境的搭建,文件上传,SpringData JPA数据持久化,CKEditor5的安装,CKEditor图片上传,...

树下魅狐
30分钟前
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部