• 帮助大家学习对接口和反射理解,另外帮我解惑下其中的一个问题


    代码
      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 using System.Reflection;
      6 
      7 namespace ConsoleTest
      8 {
      9     //接口定义
     10     interface IEmploy 
     11     {
     12         //继承该接口要实现的方法
     13         void Speak(string s); 
     14     }
     15 
     16     //接口定义2
     17     interface ISurface
     18     {
     19         void Speak(string s); 
     20         void Surface();
     21     }
     22 
     23 
     24     //Hello类实现接口,继承了2个接口
     25     public class Hello : IEmploy, ISurface
     26     {
     27         //实现接口1方法
     28         public void Speak(string  s) //实现方法
     29         {
     30             Console.WriteLine("Hello" + s);
     31         }
     32         //实现接口2方法
     33         public void Surface()
     34         {
     35             Console.WriteLine("Test");
     36         }
     37         //实现方法2的Speak方法,为了避免编译冲突,必须使用显式实现
     38         void ISurface.Speak(string s)
     39         {
     40             Console.WriteLine("ISurface.Speak:" + s);
     41         }
     42     }
     43 
     44     //Sorry类实现接口的方法
     45     public class Sorry : IEmploy
     46     { 
     47         public void Speak(string s)
     48         {
     49             Console.WriteLine("Sorry"+s);
     50         }
     51     }
     52 
     53     /// <summary>
     54     /// 直接实例化使用
     55     /// </summary>
     56     public class bll
     57     {
     58         /***********
     59         1.类成员继承了IEmploy 只能通过 IEmploy 接口使用Speak方法
     60         比如,不能如下的方法使用:
     61         Hello h1 = new Hello();
     62         h1.Speak("直接调用,hello类"); 
     63 
     64         2.IEmploy,ISurface 接口的两个方法实现都是分离的,都不可以直接在类中使用
     65 
     66         3.有个我不太理解,我以为下面是可以的,但是却不行
     67          Hello H1=new Hello();
     68          IEmploy test=(IEmploy)H1;
     69          编译提示错误A field initializer cannot reference the non-static field, method, or property 'ConsoleTest.bll.H1'
     70         ***********/
     71         IEmploy dal = new Hello();
     72         ISurface dal3 = new Hello(); 
     73         IEmploy dal2 = new Sorry();
     74         public void SpeakHello()
     75         {
     76             dal.Speak("直接调用,hello类"); 
     77         } 
     78         public void SpeakSorry()
     79         {
     80             dal2.Speak("直接调用,sorry的类");
     81         }
     82         public void SurfaceTest()
     83         {
     84             dal3.Surface();
     85         }
     86         public void ISurfaceSpeak()
     87         {
     88             dal3.Speak("使用ISurface接口的Speak");
     89         }
     90     }
     91 
     92     /// <summary>
     93     /// 通过反射实例化
     94     /// </summary>
     95     public class bll2
     96     {
     97         IEmploy dal = (IEmploy)Create("ConsoleTest.Hello");
     98         IEmploy dal2 = (IEmploy)Create("ConsoleTest.Sorry");
     99 
    100         static string FullName = System.Reflection.Assembly.GetExecutingAssembly().FullName;
    101         //这里重新实现了接口的方法,可以给接口的方法进行扩展之类的处理
    102         public void SpeakHello()
    103         {
    104             dal.Speak("反射调用,hello类");
    105         }
    106         public void SpeakSorry()
    107         {
    108             dal2.Speak("反射调用,sorry的类");
    109         }
    110 
    111         /// <summary>
    112         /// 要返回的类,包含命名空间
    113         /// </summary>
    114         /// <param name="name"></param>
    115         /// <returns></returns>
    116         public static object Create(string name)
    117         { 
    118             //这由于是当前程序集使用,所以用这种方法获取,不知道还有没其他方法
    119             Assembly assembly = Assembly.Load(FullName);
    120             Type type = assembly.GetType(name);
    121             object obj = Activator.CreateInstance(type);
    122             return obj;
    123         }
    124     }
    125 
    126     class Program
    127     { 
    128         static void Main(string[] args)
    129         { 
    130             bll b = new bll();
    131             bll2 b2 = new bll2();
    132             b.SpeakHello();
    133             b2.SpeakHello();
    134             b.SpeakSorry();
    135             b2.SpeakSorry();
    136             b.SurfaceTest();
    137             b.ISurfaceSpeak();
    138             System.Threading.Thread.Sleep(100000);
    139         } 
    140     } 
    141 }
    142 
  • 相关阅读:
    基于k8s搭建微服务日志收集中心
    分析java堆内存满时那些类占用内存居多
    yizimi 在 DMG 的板子库 (数据结构与算法)
    Contest 3/14
    基础算法训练1
    图论基础训练
    2021.03.09随笔
    树莓派 4B 安装 openEuler
    Docker 学习准备
    关于备案第二个服务器时遇到的问题
  • 原文地址:https://www.cnblogs.com/wyxy2005/p/1750941.html
Copyright © 2020-2023  润新知