gpt4 book ai didi

c# - 为什么我们在使用派生类型的实例时传递值?

转载 作者:太空宇宙 更新时间:2023-11-03 12:44:48 24 4
gpt4 key购买 nike

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

Polygon polygon = new Square(4.5f);

上面的例子来自一本书,书中说“实际上可以使用像 Square 这样的派生类型的实例,但只知道它是一个 Polygon”

现在我的问题是:

1- 在什么情况下派生类可以是基类?我的意思是在计算机将派生类作为基类处理而我们不知道或我们无意的情况下。

2- 为什么我们应该向派生类传递一个像“4.5f”这样的值?为什么我们不能像创建普通类的实例那样对待它并写:

Polygon polygon = new Square();

最佳答案

从最简单的第 2 个开始:

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

Square() being a struct (Structs are light-weight objects, also a bit different from classes), all the public fields has to be initialized in its constructor which has parameters, otherwise the compiler will throw a compiler error if you don't initialize the public fields. however, structs has a implicitly parameterless constructor defined which could be used.

The compiler provides a default, parameterless constructor signature if none, only if none constructor is defined (It only applies on classes).

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

Polygon polygon = new Square();

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

这个与inheritance有关和 polymorphism .

In C# a class can inherit from a single class and many interfaces, not more and struct can only inherit interfaces.As C# only allows a class to inherit from a single class, in other hand it allows you to have nested inheritance: class A : B : C : D and so on.

Polymorphism infers that a class can take many forms. It works in the basis that a derived class has all the features it's base class.

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

我建议您阅读这本书:C# 6.0 Pocket Reference,作者 Joseph Albahari 和 Ben Albahari

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

关于c# - 为什么我们在使用派生类型的实例时传递值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37699518/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com