如何在类的方法中引用创建的类实例?

时间:2019-06-04 15:31:56

标签: c# class methods instance

这是我的代码(只是Main Program类之外的类)。

它有2个类:具有一些属性的Vehicle和继承了Vehicle并具有更多功能的Car,例如Car“ Car()”的构造函数,用于打印有关特定Car“ PrintCarInfo()”的信息的方法以及用于Car类,用于打印创建的Car实例的数量。

public class Vehicle
{
   protected double speed;
   protected int wheels = 4;
   protected string color;
   protected string manufacturer;
}

public class Car : Vehicle
{
    static int carCounter = 0;

    public Car(double speed, string color, string manufacturer)
    {
        this.speed = speed;
        this.color = color;
        this.manufacturer = manufacturer;
        Interlocked.Increment(ref carCounter);
    }

    public void PrintCarInfo()
    {
        Console.WriteLine("Speed of car is {0}", speed);
        Console.WriteLine("Car has {0} wheels", wheels);
        Console.WriteLine("Car is {0}", color);
        Console.WriteLine("Car was made by {0}", manufacturer);
        Console.WriteLine();
    }

    public static void NumberOfCars()
    {
        Console.WriteLine("Number of cars created: {0}", carCounter);
        Console.WriteLine();
    }

我创建了一个新的Car实例:Car car1 = new Car(120, "Red", "Porsche");之后,如何在PrintCarInfo()-method中打印该特定实例的名称?

当前,PrintCarInfo()方法可打印汽车的速度,车轮,颜色和制造商,但我想在其之前打印该特定实例的名称。

类似Console.WriteLine("Info about {0}", "Insert instance reference here")

我想避免将实例作为方法的参数,例如car1.PrintCarInfo(car1);

如何引用创建的实例? (在这种情况下为car1)

我尝试玩object carObject;,但没有成功。

2 个答案:

答案 0 :(得分:1)

我在评论中写道:

  

我认为这不会像您期望的那样容易。有nameof(),但您必须在调用PrintCarInfo时使用它,而不是在其中使用它。另一个简单的解决方案是给汽车起一个名字(就像它有速度一样)。

据我所知,在调用的函数内无法使用nameof。我知道.net有一些带有属性的疯狂东西,但我从未听说过这样的东西。

Op说,他们给每辆车起了个名字,如果不是解决这个问题的最佳方案,那将是一个很好的选择。

答案 1 :(得分:0)

使用虚拟属性/方法返回所需的标签。在基类的输出部分中引用虚拟属性/方法。然后它将拾取正确实例的标签。 示例:

        var cmark = {
            x: 0,
            y: 0,
            rad:0,
            clr: null,
            setArc: function () {
                ctx.beginPath();
                ctx.arc(this.x, this.y, this.rad, 0, Math.PI * 2, true);
                ctx.fillStyle = this.clr;
                ctx.fill();
            }
        };
        [].forEach.call(centroids, (c) => {
            cmark.x = c[0];
            cmark.y = c[1];
            cmark.clr = '#0B6623';
            cmark.rad = 25;
            cmark.setArc();
        });
    });

这将导致以下输出

class Program
{
    static void Main(string[] args)
    {
        Vehicle v = new Vehicle();
        Car c = new Car();

        Console.WriteLine("Testing Vehicle base output");
        v.PrintInfo();
        Console.WriteLine("Testing Car inherited output");
        c.PrintInfo();

        return;
    }
}

class Vehicle
{
    public virtual string MyTypeName() { return "Vehicle"; }

    public void PrintInfo()
    {
        Console.WriteLine(string.Format("Type: {0}", this.MyTypeName()));
    }
}

class Car : Vehicle
{
    public override string MyTypeName() { return "Car"; }
}