C# 为什么在使用派生类型的实例时传递值?

C# 为什么在使用派生类型的实例时传递值?,c#,derived-class,C#,Derived Class,假设Polygon是我们的基类,Square是我们的派生类,我们想制作这样一个派生类的实例: Polygon polygon = new Square(4.5f); 上面的例子来自一本书,书中说“实际上可以使用一个派生类型的实例,比如正方形,但只知道它是一个多边形” 现在我的问题是: 1-在哪些情况下,派生类可以是基类?我的意思是,当计算机把派生类当作基类,而我们不知道它或者它不是我们的意图时 2-为什么我们应该用派生类传递“4.5f”这样的值?为什么我们不能像创建普通类的实例并写入时那样处理

假设Polygon是我们的基类,Square是我们的派生类,我们想制作这样一个派生类的实例:

Polygon polygon = new Square(4.5f);
上面的例子来自一本书,书中说“实际上可以使用一个派生类型的实例,比如正方形,但只知道它是一个多边形”

现在我的问题是:

1-在哪些情况下,派生类可以是基类?我的意思是,当计算机把派生类当作基类,而我们不知道它或者它不是我们的意图时

2-为什么我们应该用派生类传递“4.5f”这样的值?为什么我们不能像创建普通类的实例并写入时那样处理它:

Polygon polygon = new Square();

从最简单的第二个开始:

在这种情况下,您正在创建一个Square
newsquare(4.5f)
的实例,因为Square可以是一个类或结构,它定义了一个带有as参数的构造函数签名

Square()
作为一个(结构是轻量级对象,与类也有点不同),所有公共字段都必须在其具有参数的构造函数中初始化,否则如果不初始化公共字段,编译器将抛出编译器错误。但是,structs定义了一个隐式的无参数构造函数,可以使用它

编译器提供一个默认的无参数构造函数签名(如果没有),只有在没有定义构造函数时才提供(它只应用于类)

简而言之,如果没有任何其他构造函数重载,则必须实例化该对象,并将浮点作为参数传递。在这种情况下,我假设它是一个类。如果它是一个
struct
,正如我所说,Structs有一个隐式定义的无参数构造函数,因此下面的内容是有效的

Polygon polygon = new Square();

现在让我们回到第一个问题:

这一个与和有关

在C#中,一个类可以继承单个类和多个接口,而不是更多,struct只能继承接口。 由于C#只允许类从单个类继承,另一方面,它允许嵌套继承:类a:B:C:D等等

多态性推断一个类可以有多种形式。它的工作原理是派生类具有其基类的所有特性

在C#中,公共成员的使用是静态确定的(编译时间而不是运行时),因此当派生对象采用其基对象的形式时,它只能访问其基定义的成员。同样在使用方法签名中的基作为参数的情况下,它可以接收自身的不同实现

我建议你阅读这本书:约瑟夫·阿尔巴哈里和本·阿尔巴哈里的《C#6.0袖珍参考》


对不起,如果我把事情弄复杂了:)

第一部分的答案可能是。第二部分大概是“因为Square构造函数有一个float参数”——它与派生类没有任何关系。如果
Foo
没有无参数构造函数(或只有可选参数或参数数组的构造函数…),则不能使用
new Foo()
。谢谢,我稍后会阅读,但您确定它与接口有关吗?我没有得到第二部分的答案。为什么我们应该传递一个常量值,比如4.5,而不是一个数据类型为“int numbers”的变量?这是相同的原理,只是基类而不是接口。是的,你确实得到了第二部分的答案,但是你没有问常量和变量的问题。。。传递一个
float
变量而不是常量是可以的。我的意思是我不能理解第二部分。因为正如我所看到的,Square是一个类,而不是构造函数,如果我没有错的话,它甚至不是一个方法,我不确定4.5在传递给一个类之后会发生什么?我从来没有看到过在你将参数传递给一个类之前,我的假设哪一部分是错误的?是的,Square是一个类,但你在调用构造函数。如果你还不知道构造器是什么,现在是时候回到教程或书上了-虽然堆栈溢出对于填补知识中的特定漏洞很好,但它不是一个学习语言基础知识的好地方,因为一本书可以以一种更加结构化、有序的方式教你。谢谢,你没有使任何事情复杂化,我是初学者,我能辨认出一些东西。