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是基类型,而不是派生类型。首先,如果可能,要访问更多成员,您可以始终向上转换。例如,公司