C#类继承基类方法,实现接口实践

63 阅读2分钟

今天做这个实践是为了测试类继承和实现接口各个方法调用情况。

基类BaseA代码

   public  class BaseA
    {
        //我是基类方法
        public void SaveDataCommon()
        {
            Console.WriteLine("我是基类BaseA方法SaveDataCommon");
        }

        public void TestDataBaseA()
        {
            Console.WriteLine("我是基类独立的新方法TestDataBaseA");
        }
    }

接口 IBaseA代码

  public interface IBaseA
    {
        /// <summary>
        /// 接口方法一
        /// </summary>
        void SaveDataCommon();

        /// <summary>
        /// 接口方法二
        /// </summary>
        void OtherRunIBaseA();
    }
}

基类BaseA和接口IBaseA有一个同名方法SaveDataCommon(),我们要测试到底是调用哪个? 接口 IBaseB代码

    public interface IBaseB
    {
        void OpenDataIBaseB();
    }

测试类 TestClass 代码

  public class TestClass : BaseA, IBaseA, IBaseB
    {
        public void OpenDataIBaseB()
        {
            Console.WriteLine("我实现了B接口的方法OpenDataIBaseB");
        }

        public void OtherRunIBaseA()
        {
            Console.WriteLine("我实现了A接口的方法OtherRunIBaseA");
        }
        //public new void SaveDataCommon()
        //{
        //    Console.WriteLine("隐藏了接口和基类方法");
        //}

        public void MySelfOpen()
        {
            Console.WriteLine("我自己独立的方法MySelfOpen");
        }
    }

测试代码

   Console.WriteLine("TestClass可以使用全部方法");
            TestClass testClass = new TestClass();
            testClass.OtherRunIBaseA();
            testClass.SaveDataCommon();
            testClass.TestDataBaseA();
            testClass.OpenDataIBaseB();
            testClass.MySelfOpen();
            Console.WriteLine("===================");
            Console.WriteLine("IBaseB只能使用实现自己的方法");
            IBaseB ib = new TestClass();
            ib.OpenDataIBaseB();
            //ib.SaveDataCommon(); 不行的
            //ib.MySelfOpen(); 不行的
            // ib.TestDataBaseA();  不行的


            Console.WriteLine("===================");
            Console.WriteLine("IBaseA只能使用实现自己的方法");
            IBaseA ia = new TestClass();
            ia.SaveDataCommon();//类没有实现,调用的是基类方法
            ia.OtherRunIBaseA();
            // ia.MySelfOpen();不行的
            // ia.TestDataBaseA();  不行的


            Console.WriteLine("===================");
            Console.WriteLine("BaseA只能使用继承自己的方法");
            BaseA baseA = new TestClass();
            baseA.TestDataBaseA();
            baseA.SaveDataCommon();
            //  baseA.MySelfOpen();不行的
            // baseA.OtherRunIBaseA(); 不行的
            //ib.OpenDataIBaseB();不行的

测试结果图

image.png

结论是:

使用TestClass接受实例化 可以使用接口和基类所有方法。 如果使用IBaseB接受实例化,只能使用接口IBaseB对应的方法 如果使用IBaseA接受实例化,只能使用IBaseA对应的方法,如果和基类方法相同,则使用的是基类方法 如果使用BaseA 接受实例化,只能使用基类BaseA对应的方法

如果要把基类方法和接口方法隐藏,就必须在方法前面加new 代码

   public new void SaveDataCommon()
        {
            Console.WriteLine("隐藏了接口和基类方法,这是我重新的方法SaveDataCommon");
        }

运行结果图

image.png

结论

类接受实例化,和接口接受实例化都是重写后的方法。 基类接受实例化还是调用原来基类的方法。