我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C#入门之定义类成员与接口实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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#入门之定义类成员与接口实现的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C#入门之定义类成员与接口实现

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C#快速实现IList非泛型类接口的自定义类作为数据源

本文主要介绍了C#快速实现IList非泛型类接口的自定义类作为数据源,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-02-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录