Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用基类和派生类进行实例化的区别_C#_Object_Derived Class_Base Class - Fatal编程技术网

C# 使用基类和派生类进行实例化的区别

C# 使用基类和派生类进行实例化的区别,c#,object,derived-class,base-class,C#,Object,Derived Class,Base Class,有人能解释一下通过基类引用实例化派生类和通过派生类名本身实例化派生类之间的区别吗 请通过这个程序 using System; abstract class Test { public int _a; public abstract void A(); } class Example1 : Test { public override void A() { Conso

有人能解释一下通过基类引用实例化派生类和通过派生类名本身实例化派生类之间的区别吗

请通过这个程序

    using System;

    abstract class Test
    {
        public int _a;
        public abstract void A();
    }

    class Example1 : Test
    {
        public override void A()
        {
        Console.WriteLine("Example1.A");
        base._a++;
        }
    }

    class Example2 : Test
    {
        public override void A()
        {
        Console.WriteLine("Example2.A");
                base._a--;
        }
    }

    class Program
    {
        static void Main()
        {
        // Reference Example1 through Test type.
        Test test1 = new Example1();
        test1.A();

        Example2 test2 = new Example2();
        test2.A();
        }
    }
问题又来了,Main()方法中创建了两个对象

第一个对象test1是通过Test(基类)类型引用的,它实际上意味着什么?它与基于派生类的第二个对象有什么区别

在引用基类或派生类的首选程序中,它有何帮助


我知道我的问题有点含糊,但任何关于这一点的想法都将对我进一步学习非常有帮助。谢谢。

当使用继承和一般抽象时,我会考虑从类中使用什么,然后使用它的类型表示的最通用(抽象)版本来保存变量和方法签名(例如,示例1)。 只要您没有违反原则,这将为您带来重构的自由,而阻力最小,确保您不会一眼就认为代码依赖于特定于派生类的任何辅助方法

示例2给人的印象是代码完全依赖于该实现,这可能是适当的,但通常表示紧密耦合

Example2 test2 = new Example2();
test2.A();
这是设计/编译时与运行时的区别。在运行时,它们都产生相同的结果,唯一的例外是在使用反射时。在equals右侧发生的事情不受equals左侧的类型定义的影响

Test test1 = new Example1();
当您使用基类类型新建派生类对象时,您使用的是多态性的概念

在您的示例中,我们看不到使用多态性的优势,但在其他一些情况下,应用多态性可以帮助我们编写简洁的代码。例如,当您需要许多不同派生类的对象来调用其虚拟(或抽象)方法时,您可以创建一个基类列表,但将每个对象作为不同的派生类创建,这样您就可以遍历该列表并以简洁的方式调用该方法


可能很难用文字来理解它,但您可以在的第一个示例代码中找到多态性的一般用法,我们可以将调用不同派生类的许多虚拟方法的代码压缩到仅1行(s.Draw();)。因此,在不应用多态性的情况下,我们只能分别新建多个对象并分别调用Draw()方法,这显然不是在这种情况下编写代码的好方法。

了解OOPS和多态性,您将得到答案。
Test test1 = new Example1();