例如,我有一个继承自Vehicles
的公共类MobileObjects
。 Vehicles
班级有10meters
,23meters
,12meters
作为数据。
我如何将该信息添加到此数组?
static void Main(string[] args) {
Console.WriteLine("hello");
MobileObjects[] array = new MobileObjects[3];
MobileObjects mob = new MobileObjects();
mob.setName("Jawaharal");
mob.setPosition();
mob.getID();
array[0] = mob;
MobileObjects mob1 = new MobileObjects();
mob1.setName("Willow");
mob1.setPosition();
array[1] = mob1;
MobileObjects mob2 = new MobileObjects();
mob2.setName("Indira");
mob2.setPosition();
array[2] = mob2;
foreach (MobileObjects host in array) {
Console.WriteLine("Name : " + host.Name + " ");
Console.WriteLine("ID : " + host.id);
Console.WriteLine("Position: " +
host.Position[0] + " " +
host.Position[1] + " " +
host.Position[2]);
}
}
答案 0 :(得分:0)
您可以将Vehicle实例强制转换为MobileObject,然后将其添加到数组中。 (在所有情况下,这不是必要的强制转换,但根据您的Vehicle和MobileObjects类的属性,可能是您所需要的)
Vehicle veh1 = new Vehicle();
/// Add veh1 parameters
array[3] = (MobileObjects)veh1;
注意:由于您将实例转换为其基类,因此您现在应该只能在查看数组[3]项时访问共享参数。
答案 1 :(得分:0)
最简单的答案是使用C#泛型集合,如Array或List和auto属性。
您可以在此处找到有关收藏的信息:
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/collections
有关自动属性的信息如下:
似乎你想坚持使用getter和setter。为了与您当前的约定保持一致,您可以使用SetAt方法。
array[0].SetPositionAt(0, 10);
array[0].SetPositionAt(1, 23);
但是,要执行此操作,您需要在MobileObject中分配空间。
public class MobileObject
{
private int[] _position;
public MobileObject()
{
Position = new int[3];
}
public void SetPositionAt(int idx, int value)
{
_position[idx] = value;
}
public int GetPositionAt(int idx)
{
return _position[idx];
}
}
然后你会得到这样的信息:
host.GetPositionAt(0)
答案 2 :(得分:0)
首先让我重申我所想的你要问的内容:
如何判断数组中的对象是
baseClass
类型还是derivedClass
类型,以便在适用时显示derivedClass
的属性?< / p>
如果这是正确的,一种方法是使用is
关键字检查当前项是否是特定类型,并使用as
关键字来获取该类型的对象(有额外的属性):
if (someArrayItem is DerivedClass)
{
DerivedClass itemAsDerived = someArrayItem as DerivedClass;
Console.WriteLine(itemAsDerived.SomeDerivedProperty);
}
这是一种使用一些简单示例的方法(因为您没有提供要使用的类,我将在这里创建自己的,我们有一个公共基类Vehicle
,以及两个派生类他们自己独特的属性):
public class Vehicle
{
public string Name { get; set; }
public Color Color { get; set; }
}
public class Car : Vehicle
{
public int SeatCount { get; set; }
}
public class Truck : Vehicle
{
public double CargoCapacity { get; set; }
}
现在我们可以将这些项目的混合添加到List<Vehicle>
:
private static void Main()
{
var vehicles = new List<Vehicle>
{
new Vehicle {Name = "Vehicle", Color = Color.Blue},
new Truck {Name = "Pickup Truck", Color = Color.Red, CargoCapacity = 12.4},
new Car {Name = "SUV", Color= Color.Purple, SeatCount = 7}
};
foreach (Vehicle vehicle in vehicles)
{
Console.Write("This item is a: " + vehicle.Color.Name + " " + vehicle.Name);
if (vehicle is Truck)
{
// It's a truck so create a truck from it and show the truck properties
Truck truck = vehicle as Truck;
Console.Write(" with cargo capacity of " + truck.CargoCapacity +
" square feet.");
}
else if (vehicle is Car)
{
// It's a car so create a car from it and show the car properties
Car car = vehicle as Car;
Console.Write(" with seating for " + car.SeatCount + " people");
}
Console.WriteLine();
}
GetKeyFromUser("\nDone! Press any key to exit...");
}
<强>输出强>
答案 3 :(得分:0)
从您的描述中很难知道您需要什么。我希望我理解得很好。
首先 - 在其他答案中,大部分时间使用List都优于数组。
这是一段代码:
using System;
namespace NamedTuple
{
class Program
{
static void Main(string[] args)
{
MobileObject[] mobileObjects = new MobileObject[3];
// insert MobileObject
MobileObject mob1 = new MobileObject()
{
Name = "Jawahara",
Position = (12, 15),
Id = 123456
};
mobileObjects[0] = mob1;
//Insert Vehicle
Vehicle veh = new Vehicle()
{
Name = "Willow",
Position = (14, 13),
Id = 6549879,
Length = 23
};
mobileObjects[1] = veh;
//Insert another vehicle
mobileObjects[2] = new Vehicle()
{
Name = "Indira",
Position = (14, 13),
Id = 885298451,
Length = 12
};
foreach (var mobileObject in mobileObjects)
{
Console.WriteLine($"Name: {mobileObject.Name}, " +
$"Position: {mobileObject.Position.X };{mobileObject.Position.Y}, " +
$"Id: {mobileObject.Id}");
if(mobileObject is Vehicle)
{
Console.WriteLine($"Length: {((Vehicle)mobileObject).Length}");
}
}
}
}
public class MobileObject
{
public string Name { get; set; }
public (int X, int Y) Position { get; set; }
public int Id { get; set; }
}
public class Vehicle : MobileObject
{
public int Length { get; set; }
}
}