首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >初学者对C#:如何做构造函数链接,覆盖和使用:this / :base?

初学者对C#:如何做构造函数链接,覆盖和使用:this / :base?
EN

Stack Overflow用户
提问于 2017-07-27 08:10:58
回答 5查看 2.6K关注 0票数 1

我去年学习过Java,我认为我从来没有遇到过编写构造函数的问题。不幸的是,对于C#中的重载和链接是如何工作的,甚至是它的基本概念,我感到非常困惑。

我见过:基础在继承中得到使用,但我不确定如何使用。我见过:它在很多地方都被使用了,而且它总是困扰着我为什么要使用它。

下面是一些代码的示例:这(为参数起见,使公共变量不带setter/getter)。

代码语言:javascript
复制
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个参数.所以它们都是超负荷的,而且链也很合适。

所以它应该看起来(可能不对)是这样的:

代码语言:javascript
复制
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;
    }

当然,我不确定上面的任何代码是否有意义,但是我已经看到了一些带有构造函数的类,其中包括:每个类,以及每个构造函数链接到下面的类,直到用户能够创建一个具有任何参数组合的对象。

至于:基地,这完全把我弄糊涂了。下面是我在网上发现的一个例子:

代码语言:javascript
复制
    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指的是父类,但我不知道为什么和如何。另外,为什么是:在第一个构造函数中使用这个而不是:base?

有两个方面我很困惑。使用:基本和理解构造函数链接和重载是如何工作的。如果我的问题太抽象,请告诉我。我已经试着尽可能的说得更具体。

非常感谢你们的支持和时间。非常感谢!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-07-27 08:22:14

我会尽量简单地解释。

构造函数重载

这里没有什么新的,就像重载任何其他方法一样--您只需使用相同的名称,只需使用不同的签名(即传递给构造函数的不同参数)。

构造链

这是通过使用关键字this来完成的--就像在您问题中的代码示例中一样。

顺便说一句,我通常用它从最精细的构造函数到最简单的构造函数。

样本代码:

代码语言:javascript
复制
public class Person
{
    public Person()
    {
        Children = new List<Person>();
    }

    public Person(string firstName)
        : this()
    {
        this.FirstName = firstName;
    }

    public Person(string firstName, string lastName)
        : this(firstName)
    {
        this.LastName = lastName;
    }

    public string FirstName { get; }
    public string LastName { get; }
    public IEnumerable<Person> Children { get; }
}

当然,使用构造函数链接将默认值设置为属性是一种有效的设计,我在需要时自己使用了它,但情况通常并非如此。

关键字base

此关键字始终引用基类(或父类)。在重写方法和属性时,您也会看到很多。

当涉及构造函数时--您的假设是正确的--它确实引用了基(或父)类。因此,当在构造函数中使用时(就像在循环示例中一样),可以控制派生(或子)类构造函数将执行的基构造函数的重载。

因此,例如,如果基类包含三个构造函数,则可以选择要调用哪个构造函数。

除非另有规定,c#将派生类的构造函数链接到基类的默认构造函数。

请注意,如果从没有默认构造函数(意为:无参数)构造函数的类继承,则必须在构造函数中指定: base(...),即使基类只有一个构造函数(因为这是将所需参数传递给它的唯一方法)。

票数 5
EN

Stack Overflow用户

发布于 2017-07-27 08:23:02

一般来说,: this(...)是指当前类的构造函数。如您的示例所示,这可以用来避免代码重复。我认为从逻辑的角度看,给出的例子没有太多意义,但它是合法的C#,基本上也是: this(...)的使用方式。

第二个例子是mit更符合逻辑或更连贯,因为默认构造函数提供了合理的默认值来传递给参数化构造函数。

这是默认构造函数,它为要传递给参数化构造函数的值创建合理的默认值:

代码语言:javascript
复制
public Circle():this(Color.Black, new Point(0,0), 1)

这是参数化构造函数,它将基类所需的参数传递给形状的构造函数:

代码语言:javascript
复制
public Circle(Color Colour, Point Position, double Radius):base(Colour, Position) 

如果你需要一个标准的圆圈,你可以用

代码语言:javascript
复制
var shape = new Circle();

另一方面,如果您需要在特定位置,具有特定颜色和特定半径的圆圈,则可以使用参数化构造函数创建一个圆圈。

代码语言:javascript
复制
var shape = new Circle(Color.Silver, new Point(1,2), 5);
票数 2
EN

Stack Overflow用户

发布于 2017-07-27 08:21:24

我想:base指的是父类,但我不知道为什么和如何

base是访问父类成员的关键字。

1) var p = base.Property;将从父类访问字段或属性

2) base.Method();将从父类访问方法

3) base(..)将从父类访问构造函数

为什么:这个在第一个构造函数中使用,而不是:base?

this是访问同一类内存的关键字。有3个参数定义了Circle的属性。CircleShape只共享一个属性:color。因此,默认构造函数调用同一个类Circle的更专门的构造函数(这就是为什么this()),第二个构造函数将共享属性color传递给要处理的父构造函数。

代码语言:javascript
复制
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;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45344913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档