2

我有一个类,它有一个字符串('name')和一个特征字典('features')。通过在文件中查找名称并从那里提取特征来构建实例。我在代码的其他地方向字典中添加了额外的功能。我想知道的是,是否可以在孩子的构造函数中使用父对象的实例?

例如

public parentClass(string name)
{
    this.name = name
    this.features = ... gets features from file ...
}

public childClass(parentClass parentObject, feature extraFeatureValue)
{
   childObject = parentObject???
   this.features[extraFeature] = extraFeatureValue
}

我假设我应该
a) 为具有额外功能的对象创建一个新类,所以我可以知道哪个是哪个
b) 使新类成为旧类的子类,因为它只是一些额外的功能,我想保留方法

谢谢

4

3 回答 3

5

我想知道的是,是否可以在孩子的构造函数中使用父对象的实例?

是的你可以。使用base关键字。另请注意,您不需要将父实例传递给子构造函数。Child如果您创建一个新实例,则将隐式调用父级的默认构造函数。如果要调用基类的自定义构造函数,请在子构造函数中调用基类构造函数。就像下面的示例一样。

您还可以在MSDN中阅读有关构造函数的更多信息。

class Program
{
    static void Main(string[] args)
    {
        Parent p = new Child();
    }
}

class Parent
{
    public Parent()
    {
        SomeBaseProp = "BaseProperty";
    }

    public Parent(string name)
    {
        SomeBaseProp = name;
    }
    public string SomeBaseProp { get; set; }
}

class Child : Parent
{
    public Child()
    {
        Console.WriteLine(base.SomeBaseProp);
    }

    public Child(string someString) : base(someString)
    {  } //this will call the custom constructor of your base class before constructing this child class

    public int SomeChildProp { get; set; }
}
于 2013-06-18T07:18:53.393 回答
0

从您的代码中,您似乎在问如何使用子类中的父类构造函数?

您可以像这样调用基本构造函数:

public ChildClass(string name, Feature extraFeature)
:base(name) //this initializes this class with the constructor of the base class
{
    Features.Add(extraFeature); //this adds your extraFeature to the features-list.
}

尽管如此,我确实很难完全理解你的问题。例如; 如果这个额外的特性必须传递给 ChildClass 的构造函数,给你的父类一个 AddFeature 方法不是很好吗?

或者 ChildClass 具有额外的功能总是相同的,在这种情况下它不需要作为构造函数参数?

name 参数是类的名称,而功能列表实际上只是要调用的方法列表?如果是这样的话; 您是否考虑过使用反射?

编辑; 我对你的情况的看法:

public class FeatureObject
{
    public String Name { get; private set; }
    public Dictionary<String,String> Features { get; private set; }


    public FeatureObject (string name)
    {
        Name = name;
        Features = new Dictionary<String, String>();
        Features.Add("Name",name);//just an example of a feature that all objects have
    }
}

public class Fish: FeatureObject
{
    public Color Color { get; private set; }

    public Fish(String name, Color color)
    :base(name) //initializes Name and Features as described in FeatureObject-class
    {
        Features.Add("Color", color.ToString());//Adds color to the features-dictionary
    }
}

我仍然认为你可以更轻松地做到这一点。

例如,此方法将尝试返回对象中命名属性的字符串表示形式:

public static String GetPropertyValue(object o, String property)
{
    try
    {
        return o.GetType().GetProperty(property).GetValue(o, null).ToString();
    }
    catch(Exception)
    {
        return null;
    }
}

如果您在 Dictionary Objects 中有您的对象,您可以通过如下方法获取它们:

public static String GetPropertyValue(String objectName, String propertyName)
{
    try
    {
        var o = Objects[objectName];
        return GetPropertyValue(o, propertyName)
    }
    catch (Exception)
    {
        return null;
    }
}
于 2013-06-18T07:38:07.910 回答
0

以前的答案(现已删除)是我正在寻找的:“复制构造函数”是可能的,它将另一个相同类型的对象作为参数。

http://msdn.microsoft.com/en-us/library/ms173116(v=vs.80).aspx

所以我可以将其中之一添加到父类中,然后在子类中扩展它:

public Animal(Animal previousAnimal)
{
    this.name = previousAnimal.name;
    this.features = previousAnimal.features;
}

public Fish(parentClass animal, bool isSaltwater)
    : base(parentClass animal)
{
   this.features[SaltWaterFish] = isSaltwater;
}
于 2013-06-18T10:05:06.650 回答