C# - 将参数传递给子类的规则是什么?

时间:2017-08-30 01:41:45

标签: c# class parameters

using System;

namespace MyProgram
{
  class Point
  {
      public readonly int X;
      public readonly int Y;

      public Point (int x, int y)
      {
        X = x;
        Y = y;
}

^这是父类

namespace MyProgram
    { 
      class MapLocation : Point

      {
          public MapLocation(int x, int y, Map map) : base(x, y)

^这是子类

基本上,我的问题是:类之间的参数传递如何工作?什么是记住传递参数的规则的简单方法?而且,在它说public MapLocation(int x, int y, Map map) : base(x, y)的地方,我不明白为什么它只是x,y而不是' int'? C#变得非常令人沮丧,我没有太多的乐趣:(帮助将不胜感激。

6 个答案:

答案 0 :(得分:1)

  

它说公共MapLocation(int x,int y,Map map):base(x,y),我不明白为什么它只是x,y而不是'int'?。

想象一下你有这个:

public class ClassOne
{
    public int MethodOne(int x, int y)
    {
        return x + y;
    }
}

现在让我们来电话MethodOne

ClassOne one = new ClassOne();
int answer = one.MethodOne(2, 3); //<== see this, now read note below
int first = 2;
int second = 3;
int answer2 = one.MethodOne(first, second); //<== see this, now read note below

当您调用方法时,您将参数传递给它:不需要指定参数的类型,因为它们将从它们的类型推断出来。例如,在上面我们简单地传递2和3,因此编译器知道这些是int常量。在第二个调用中,它们是firstsecond的类型,它们都是int

当您调用这样的基础构造函数时:base(x,y),它与您调用方法时的想法相同,如上所述。 xy的类型来自:MapLocation(int x, int y, ...。如果将其更改为MapLocation(string x, int y, ...,则编译器会抱怨。 试一试,看看。

现在假设我们有一个类型不是该方法所期望的类型,如下所示:

long x = 1;
int y = 2;

现在x的类型为longMethodOne需要一个整数,因此我们需要将x投射到int(请注意,不是每个long {1}}将适合int,因此可能会失败)。以下是我们如何做到这一点:

one.MethodOne((int)x, y); //<== see the casting

答案 1 :(得分:0)

您正在定义MapLocation(int x,int y,Map map),因此您需要指明类型。你可以说它们是参数。 你正在调用base(x,y),所以x,y是参数。 参考:  What's the difference between an argument and a parameter?

答案 2 :(得分:0)

代码行public MapLocation(int x, int y, Map map) : base(x, y) 意味着,在构造MapLocation给定的整数xy和Map map时,请调用基类(Point)的构造函数,其值为xy

您不是在类本身之间传递参数,而是更恰当地调用基类的构造函数。

答案 3 :(得分:0)

base(x, y)没有说int x, int y因为它不是方法/函数声明,base正在调用传递xy的基类构造函数这是提供给MapLocation构造函数的参数。因此,正如您所期望的那样,在int构造函数中声明参数MapLocation

你如何记住规则或传递你周围的参数。在没有伤害大脑的基本简单的东西之外,你没有。

如果您了解xy是为MapLocation构造函数声明的int类型的参数,并且您了解可以使用{{1在C#中调用基类构造函数}}。然后很容易记住传递给子类构造函数的任何内容都可以通过C#中的: base()传递给父构造函数,因此在代码示例中base

: base(x, y)只是在C#中调用父类构造函数的语法糖。 base参数必须与构造函数中定义的父类参数匹配,因此在代码示例base中,Point(int x, int y)可以更快地说出base(x, y)

答案 4 :(得分:0)

  

记住传递参数规则的简单方法是什么   围绕?

C#是强类型语言,因此类型提供了如何将参数传递给其方法的规则 用于编写C#的所有现代IDE将为您提供有关应将哪些参数传递给方法的信息。所以,实际上在Visual Studio中,Intellisense会告诉你规则。 Using IntelliSense
如果提供了错误类型的参数或缺少某些参数,编译器将无法编译代码。

  

而且,它说公共MapLocation(int x,int y,Map map):   base(x,y),我不明白为什么它只是x,y而不是'int'?

: base(x, y)只是方法调用,这就是为什么你不需要再次声明类型,它们已经在基类的构造函数中声明了。

答案 5 :(得分:0)

  

我不明白为什么它只是x,y而不是&#39; int&#39;?

因为您正在调用基础构造函数。不要将此视为子类定义的一部分......这是现在实现的一部分。当您说base(x,y)时,您使用与调用任何其他函数相同的语法。