在子构造函数中使用基础对象(C#)

时间:2013-06-18 07:15:15

标签: c#

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

E.g。

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)使新班级成为旧班级的孩子,因为它只是一些额外的功能,我想保留方法

由于

3 个答案:

答案 0 :(得分: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; }
}

答案 1 :(得分: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有额外功能可能总是相同的,在这种情况下它不需要作为构造函数参数?

是名称参数,类的名称,以及功能列表实际上只是要调用的方法列表?如果是这样;你有没有考虑过使用反射?

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

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;
    }
}

答案 2 :(得分:0)

之前的答案(现已删除)是我所寻找的:&#39;复制构造函数&#39;是可能的,它将另一个相同类型的对象作为参数。

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;
}