假设 Polygon 是我们的基类, Square 是我们的派生类,我们想要创建一个派生类的实例,如下所示:
Polygon polygon = new Square(4.5f);
上面的例子来自一本书,上面写着“实际上可以使用像Square这样的派生类型的实例,但只知道它是一个多边形”
现在我的问题是:
1-在哪种情况下派生类可以是基类?我的意思是在计算机将派生类作为基类而没有我们知道它或者它不是我们的意图的情况下。
2-为什么我们应该使用派生类传递类似“4.5f”的值?为什么我们不能像处理普通类的实例那样对待它并写:
Polygon polygon = new Square();
答案 0 :(得分:1)
从最简单的第2个开始:
在这种情况下,您正在创建Square new Square(4.5f)
的实例,因为Square(可以是Class或Struct)定义了一个构造函数签名,其中float为参数。
Square()
是struct(Structs是轻量级对象,也与类有点不同),所有公共字段都必须在其构造函数中初始化,该构造函数具有参数,否则编译器将如果不初始化公共字段,则抛出编译器错误。但是,结构体有一个可以使用的隐式无参数构造函数。只有在没有定义构造函数的情况下(仅适用于类),编译器才会提供默认的无参数构造函数签名(如果不存在)。
简而言之,如果您没有任何其他构造函数重载,则必须实例化该对象,并将float作为参数传递。在那种情况下,我假设它是一个类。如果它是struct
,正如我所说,Structs有一个隐式无参数构造函数,因此下面的内容是有效的。
Polygon polygon = new Square();
现在让我们回到第一个问题:
此问题与inheritance和polymorphism有关。
在C#中,类可以从单个类和许多接口继承,而不是更多,struct只能继承接口。 由于C#只允许一个类从一个类继承,另一方面它允许你有嵌套继承:class A:B:C:D等等。
多态性推断一个类可以采用多种形式。它的工作原理是派生类具有基类的所有特性。
在C#中,公共成员的使用是静态确定的(compiter时间而不是在运行时),因此当派生对象采用其基础对象的形式时,它只能访问其基础定义的成员。同样,在方法签名中使用base作为参数的情况下,它可以接收自身的不同实现。
我建议你阅读这本书:C#6.0 Pocket Reference,作者:Joseph Albahari&本·阿尔巴哈里
对不起,如果我把事情搞复了:)