C#拾遗之方法(二)

       继续接着上一篇来谈C#语言的方法

       三,虚方法和重写方法

       重写方法用相同的签名重写所继承的虚方法。虚方法声明用于引入新方法,而重写方法声明则用于使现有的继承虚方法专用化。用override声明所重写的那个方法称为已重写了的基方法。

        重写声明和已重写了的基方法具有相同的声明可访问性。换句话说,重写声明不能更改所对应的 虚方法的可访问性。但是,如果已重写的基方法是protected,并且声明它的程序集不是包含重写方法的程序集,则重写方法声明的可访问性必须是protected。

        重写override一般用于接口的实现和继承类的方法改写时应注意:

        (1)覆盖的方法的标志要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果

        (2)覆盖的方法的返回值必须和被覆盖的方法的返回值一致

        (3)覆盖的方法所抛出的异常必须和被覆盖的方法所抛出的异常一致,或者是其子类

        (4)被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖

        例三,创建一个虚方法并重写这个虚方法,通过调用两个方法比较结果

<span style="font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Text
{
    class A
    {
        public virtual void a()//创建的虚方法
        {
            Console.WriteLine("这是虚方法");
        }
    }
    class B : A
    {
        public override void a()
        {
            Console.WriteLine("这是重写后的方法");
</span>        }
    }
    <span style="font-size:18px;">class Program
    {
        static void Main(string[] args)
        {
            B b1 = new B();//创建类B的对象b1
            b1.a();//调用重写后的a方法
            A a1 = new A();//创建类A的对象a1
            a1.a();//调用虚方法a
            A a2 = b1;//将类B的对象b1赋值给类A的对象a2
            a2.a();//调用虚方法a
            Console.ReadLine();
        }
    }
}
</span>

          输出的结果为:这是重写后的方法

                                 这是虚方法

                                 这是重写后的方法

        四,外部方法(这个方法很新奇,联想到很多)

        当方法声明包含extern修饰符时,称该方法为外部方法。外部方法是在外部实现的,编程语言通常是使用C#以外的语言。外部方法不可以是泛型。

        extern修饰符通常与DllImport属性一起使用,从而使外部方法可以由DLL(动态链接库)实现。执行环境可以支持其他用来提供外部方法实现的机制。当外部方法包含DllImport属性时,该方法声明必须同时包含一个static修饰符。

        在使用DLLImport属性时,一定要引入System.Runtime.InteropServices命名空间,此命名空间是提供各种各样支持COM interop及平台调用服务的成员。

        例四,通过外部方法和Dlllmport属性调用“User32.dll”实例自定义信息提示框的功能

<span style="font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;//必须引入的命名空间
namespace Text
{
    class Program
    {
        [DllImport("User32.dll")]//调用User32.dll
        public static extern int MessageBox(int H, string m, string c, int type);//定义的外部方法
        static int Main(string[] args)
        {
            Console.Write("请输入信息:");
            string str = Console.ReadLine();//接受输入的信息
            return MessageBox(0,str,"我的信息提示框",0);//以信息提示框输出
        }
    }
}</span>

       输出的结果为:

 

        五,分部方法

        若一个方法声明中含有partial修饰符,则称该方法为分部方法。只能讲分部方法声明为分部类型的成员,而且要遵守约束数目。分部方法有着严格的限制。分部方法必须在分部类或分部机构内声明。它们必须是私有的,不能返回值,不能有输出参数。因为任何针对没有被实现的分部方法的调用都会简单地被忽略,所以说这些限制是非常有必要的。

        分部方法不能作为一个明确分配的变量,仅被代码生成器在处理轻量级事件的时候使用。假设用户解析一个数据库或者一个XML文件,然后生成了数据类,结果会发现有数十个类,几百个属性以及一大堆泛型和模板文件等。分部方法另外一个经常被用到的地方是验证,或者让属性的setter去更新另一个属性。所以如果用户要使用产生的代码,或者在运行时有几百个事件和千个方法调用的话(其实大多数情况下只用到了其中的一点点),就可以选择分部方法。分部方法在声明和使用时要比事件容易得多,如果没有用到它们,它们就会消失。从分部方法必须是私有的限制中,

Alexander发现了该方法的不足之处,即如果用户喜欢原数据驱动的应用,并且已经被ASP.NET的数据绑定所困扰时(因为没有其他的方法可以附上原数据),那么,将来会出现丢失信息的可能。

       例五,创建一个类的分部方法并且在另一个部分中引用

<span style="font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Text
{
    public partial class Program//定义的分部类
    {
        private int _setup;//定义的字段
        public int setup//定义的方法
        {
            set
            {
                _setup=value;
            }
            get
            {
                return _setup;
            }
        }
        partial void text(int t);//声明分部方法
        partial void text(int t)//实现声明
        {
            t += _setup;
            Console.Write(t);
        }

    }
    partial class Program
    {
        static void Main(string[] args)
        {
            Program pg = new Program();//创建类对象
            pg._setup = 100;//设置属性
            pg.text(50);//调用方法
            Console.ReadLine();
        }
    }
}</span>

            输出的结果为:150



 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值