C# 为什么人们要声明他们分配给它的对象的基本类型的变量?

C# 为什么人们要声明他们分配给它的对象的基本类型的变量?,c#,class,object,inheritance,C#,Class,Object,Inheritance,下面是一个例子: abstract class baseClass { void aMethod { //something here... } } class derivedClass : baseClass { void aMethod { //something here... } } void main() { baseClass Object_1 = new derivedClass(); } 为什么将对象_1声明为基类?程序员为什么这

下面是一个例子:

abstract class baseClass
{
  void aMethod
  {
    //something here...
  }
}

class derivedClass : baseClass
{
  void aMethod
  {
    //something here...
  }
}

void main()
{
  baseClass Object_1 = new derivedClass();
}
为什么将对象_1声明为基类?程序员为什么这样做?对象_1是什么类型的?它是基类还是派生类?如果我的对象_1是这样创建的,会有什么区别:

derivedClass Object_1 = new derivedClass();
?

我正在学习C#,在这种情况下,这是我最感兴趣的环境


为什么使用基类初始化对象_1

事实并非如此。看看新的
之后是什么类型,它是派生类型。这里您拥有的是使用基类型作为引用类型引用的派生类型实例

程序员为什么这样做

具有类型化引用意味着您可以使用对象的成员。根据实际使用的层次结构类型,您可以访问相应的成员集

Derived o = new Derived()
o.xxx  <- full access to instance members

Base o = new Derived()
o.xxx. <- access is limited to members that are defined in the Base class

object o = new Derived()
o.xxx. <- you can always see an instance as of 'object' type
          and have most limited interface

为什么使用基类初始化对象_1

事实并非如此。看看新的
之后是什么类型,它是派生类型。这里您拥有的是使用基类型作为引用类型引用的派生类型实例

程序员为什么这样做

具有类型化引用意味着您可以使用对象的成员。根据实际使用的层次结构类型,您可以访问相应的成员集

Derived o = new Derived()
o.xxx  <- full access to instance members

Base o = new Derived()
o.xxx. <- access is limited to members that are defined in the Base class

object o = new Derived()
o.xxx. <- you can always see an instance as of 'object' type
          and have most limited interface

一个实际示例:您希望将一组内容传递给一个方法。方法应该对每一件事情都做些什么

在将集合传递给方法之前,必须先创建集合。要创建事物的集合,您需要一个具有Add方法的类。列表类就可以了

对于接收方法来说,向集合添加内容的能力是不相关的。它只需要能够列举集合中的内容。所以您传递的是IEnumerable,而不是List


通常,将实例指定给基类型变量可以消除噪音并缩小进行假设的空间。它说“在这一点上,子类型并不重要,因此这并不比基类型更复杂。”这让人感到轻松。

一个实际的例子:您希望将一组内容传递给一个方法。方法应该对每一件事情都做些什么

在将集合传递给方法之前,必须先创建集合。要创建事物的集合,您需要一个具有Add方法的类。列表类就可以了

对于接收方法来说,向集合添加内容的能力是不相关的。它只需要能够列举集合中的内容。所以您传递的是IEnumerable,而不是List


通常,将实例指定给基类型变量可以消除噪音并缩小进行假设的空间。它说“在这一点上,子类型并不重要,因此它不会比基类型更复杂。”这让人放心。

在编译时不知道派生类型是什么的情况下,这在工厂模式中经常使用。另外,有时另一个类需要持有对某类基类的引用,但它在编译时并不确切知道它是什么,而是在运行时计算出来,以便通过其基类的接口访问对象。我可以有一个包含Ferraris、Fords、Hondas等的列表,但是如果我想同时启动所有的汽车,那么我可以使用Car的start()方法的基类,并遍历调用该方法的汽车。通过这种方式,您可以将具有公共基类但不同子类的对象组合在一起。查看可靠的原则,尤其是“object_1使用基类初始化”的可能重复项通常并不意味着“object_1声明为基类的实例”。除非你有别的意思,否则请编辑你的文章。当你在编译时不知道派生类型是什么时,这会在工厂模式中被大量使用。另外,有时另一个类需要持有对某类基类的引用,但它在编译时并不确切知道它是什么,而是在运行时计算出来,以便通过其基类的接口访问对象。我可以有一个包含Ferraris、Fords、Hondas等的列表,但是如果我想同时启动所有的汽车,那么我可以使用Car的start()方法的基类,并遍历调用该方法的汽车。通过这种方式,您可以将具有公共基类但不同子类的对象组合在一起。查看可靠的原则,尤其是“object_1使用基类初始化”的可能重复项通常并不意味着“object_1声明为基类的实例”。除非你有别的意思,请编辑你的帖子。谢谢你的详细回答。关于您的(1)示例:当您定义baseo=new-Derived()时;您说过对象o只能访问在基类中定义的成员。若派生类的成员数比基类的成员数多怎么办?我们将无法访问它们。如何处理?关于您的(2)示例:创建派生类的对象d。然后创建一个指向该对象的引用b,但我不明白为什么要将d对象强制转换为派生类型-但是您希望b是基类型,而不是派生类型。首先,如果可能,要访问更多成员,您可以始终向上转换。至于这个例子,请纠正我的错误。谢谢你的详细回答。关于您的(1)示例:当您定义baseo=new-Derived()时;您说过对象o只能访问在基类中定义的成员。若派生类的成员数比基类的成员数多怎么办?我们将无法访问它们。如何处理?关于您的(2)示例:创建派生类的对象d。然后创建一个指向该对象的引用b,但我不明白为什么要将d对象强制转换为派生类型-但是您希望b是基类型,而不是派生类型。首先,如果可能,要访问更多成员,您可以始终向上转换。例如,公司