【发布时间】:2017-07-27 08:10:58
【问题描述】:
我去年学习了 Java,我认为我在编写构造函数方面从来没有遇到过问题。不幸的是,我对 C# 中的重载和链接是如何工作的,甚至是它的基本概念感到困惑。
我已经看到 :base 被用于继承,但我不确定如何。 我见过:这在很多地方都得到了使用,而且它总是让我感到困惑,为什么要使用它。
下面是一些带有 :this 的代码示例(为了论证而制作了没有 setter/getter 的公共变量)。
public class Person
{
public string firstName;
public string lastName;
public string height;
public int age;
public string colour;
public Person():this("George", "Seville", "45cm", 10, "Black")
{
// This is the default constructor, and we're defining the default
values.
}
public Person(string firstName, string lastName, string height, int age,
string colour)
{
this.firstName = firstName;
this.lastName = lastName;
this.height = height;
this.age = age;
this.colour = colour;
}
}}
我只能理解如何使用第一个构造函数,例如制作一个简单的“Person”对象会给它默认值。这是我能理解的。此代码未完成,因为它显示了 2 个默认构造函数。我希望能够为每个可用的变体重载和链接,即 1 个参数,2 个参数......所以它们都可以适当地重载和链接。
所以它应该有点(可能不正确)看起来像这样:
public Person():this("George", "Seville", "45cm", 10, "Black")
{
// This is the default constructor, and we're defining the default
values.
}
public Person(string firstName):this(firstName, "George", "Seville", "45cm",
10, Black)
{
this.firstName = firstName;
}
public Person(string firstName, string lastName):this(firstName, lastName,
"Seville", "45cm", 10, Black)
{
this.firstName = firstName;
this.lastName = lastName;
}
当然,我不确定上面的任何代码是否有意义,但我已经看到一些类的构造函数都带有 :this,并且每个构造函数都链接到它下面的一个,直到用户可以创建定义了任意参数组合的对象。
至于 :base,这完全让我感到困惑。这是我在网上找到的一个例子:
public class Circle:Shape
{
public Circle():this(Color.Black, new Point(0,0), 1)
{
}
public Circle(Color Colour, Point Position, double Radius):base(Colour,
Position)
{
this.Radius = Radius;
}
我认为 :base 指的是父类,但我不确定为什么以及如何。另外,为什么在第一个构造函数中使用 :this 而不是 :base?
有两个方面我很困惑。使用 :this 和 :base 并准确理解构造函数链接和重载的工作原理。如果我的问题太抽象,请告诉我。我尽量做到具体。
非常感谢大家的支持和时间。非常感谢!
【问题讨论】:
-
在最后一个中,调用
this调用 Circle 中的构造函数,然后该构造函数调用 Shape 中的基构造函数,该构造函数采用 Color 和 Position。 -
您可以为参数提供默认值,因此不需要提供。这样你就可以用一堆可选参数编写 1 个构造函数。
-
this关键字用于调用同一类的构造函数,base关键字用于调用基类或父类的构造函数。在您的最后一个示例中,您的默认构造函数正在调用Circle类的重载构造函数,而重载构造函数正在调用Shape类的参数化构造函数。此外,base关键字也可以用于调用基类或父类的任何方法。 -
如果您了解 Java 并且对 Java 感到满意,也许这与您相关:Inheritance and Derived Classes (C# vs Java) 特别关注 C# 和 Java 在继承和派生类方面的异同。
标签: c# inheritance constructor overloading chaining