2

Sorry, I may be lacking in terminology, but my searches haven't provided any answer despite the trivial question. Here goes -

I have a superclass and wish to be able to create a new object of any of the subclasses with a method like the the following:

static void AddNewVehicle(string brand, string model, int year, int price)
{
    V.Add(new Car(brand, model, year, price));
}

I imagined that I would be able to do it like this:

static void AddNewVehicle(object VehicleType, string brand, string model, int year, int price)
{
    V.Add(new VehicleType(brand, model, year, price));
}

...but I'm getting the following error:

"The type or namespace name 'VehicleType' could not be found (are you missing a using directive or an assembly reference?)"

4

3 回答 3

3

在您的场景中,您已指定VehicleType为使用 type 声明的变量的名称object。你不能像这样实例化对象。

如果您可以提供有关您的问题的更多信息,我将尝试提供更具体的答案。

例如,您可以向Vehicle名为的类添加一个新属性VehicleType,它的类型为enum.

或者,如果您在一个集合中需要多种类型的车辆,您可能希望实现factory patterninterfaces用于处理集合。

根据评论编辑:

有多种方法可以做到这一点,所以我提到了迄今为​​止其他人没有提到的一种。它基于reflection. 基本上,您在程序集中搜索继承您的“超类”的类,如果它们的名称与提供的参数对应,则实例化它。
但是,我们可以通过使用一个名为Activator. 我们需要的只是包含所需类的程序集的名称及其名称。Activator 将为我们创建它的实例。

这是一个让您入门的示例:

public static SuperClass GetClass(string type)
{
   return (SuperClass)Activator.CreateInstance("someAssemblyName", "type");
}

或来自 MSDN 的更多信息:http: //msdn.microsoft.com/en-us/library/b4wc81dc.aspx

当然,您可以在任何进一步操作之前修改属性,可能是这样的:

public static SuperClass GetClass(string type, string brand, string model)
{
   SuperClass sc = (SuperClass)Activator.CreateInstance("someAssemblyName", "type");
   sc.Brand = brand;
   sc.Model = model;

   return sc;
}
于 2013-03-31T22:15:07.933 回答
1

如果您要采用一种Factory方法,则将其用作工厂。一个静态类,为它构造东西。不多也不少。不要将状态放入该工厂以存储对象(列表V)。

然后是有点争议的静态方法

static void AddNewVehicle(object VehicleType, string brand, string model, int year, int price)
{
    V.Add(new VehicleType(brand, model, year, price));
}

你想在这里做什么?您传递了一个名为 VehicleType 的对象,但您想在主体中构造一个新对象?

然后编译错误:

找不到类型或命名空间名称“VehicleType”(您是否缺少 using 指令或程序集引用?)

这意味着您要么:

  • 没有同名的课程VehicleType
  • 没有包含声明using该类的命名空间的语句VehicleType
  • 错过对声明您的项目的引用VehicleType

(或以上任意组合)


关于您提供的代码示例的更多内容

假设您有这些类:

public class VehicleType 
{
     ... some properties, constructors and methods
}

public class Car : VehicleType
{
     ... some properties, constructors and methods
}

然后你就可以创建一个生产新车的工厂类,比如

public static class VehicleFactory
{
    public static Vehicle CreateVehicle(...)
    {
        // conditional stuff that decides what kind of vehicle to construct
        if (...) 
        {
            return new Bicycle(...);
        }
        else if (...) 
        {
            return new Car(...);
        }
        else
        {
            throw new UnsupportedVehicleException();
        }
    }
}

希望这对您有所帮助。

于 2013-03-31T22:31:29.113 回答
1

在 C# 中,类型信息通常以两种方式之一传递:类的实例Type或作为泛型类型参数。后者为您提供静态类型检查和约束

其他答案中还提到了其他策略,但您可能会发现它们既麻烦又不合适。

尝试这个:

class Vehicle
{
    static ICollection<Vehicle> V;

    string Brand;
    string Model;
    int Year;
    int Price;

    static void AddNewVehicle<T>(string brand, string model, int year, int price)
        where T : Vehicle, new()
    {
        V.Add(new T() {
            Brand = brand,
            Model = model,
            Year = year,
            Price = price
        });
    }
}

请注意:

  • 车辆具有以下字段:品牌、型号、年份和价格
  • Vehicle.AddNewVehicle 上的通用参数
  • 如果您希望 Vehicle 的子类以不同方式处理参数,请将这些字段转换为虚拟/抽象属性并根据需要覆盖它们的设置/获取行为。
于 2013-03-31T22:41:04.897 回答