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

在子构造函数(C#)中使用基对象,c#,C#,我有一个类,它有一个字符串('name')和一个功能字典('features')。 实例是通过在文件中查找名称并从中提取特征来构建的。 我正在代码的其他地方向字典添加额外的功能。 我想知道的是,是否可以在子对象的构造函数中使用父对象的实例 例如 我想我应该 a)为具有额外功能的对象创建了一个新类,这样我就可以分辨出哪个是哪个 b)使新类成为旧类的子类,因为它只是几个额外的特性,我想保留这些方法 谢谢 我想知道的是,是否可以使用 子对象的构造函数中的父对象 是的,你可以。使用关键字。还要注意,您不

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

例如

我想我应该
a)为具有额外功能的对象创建了一个新类,这样我就可以分辨出哪个是哪个
b)使新类成为旧类的子类,因为它只是几个额外的特性,我想保留这些方法

谢谢

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

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

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


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

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

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.
}
public static String GetPropertyValue(String objectName, String propertyName)
{
    try
    {
        var o = Objects[objectName];
        return GetPropertyValue(o, propertyName)
    }
    catch (Exception)
    {
        return null;
    }
}
尽管如此,我还是很难完全理解你的问题。例如;如果必须将这个额外的特性传递到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
    }
}
如果您的对象位于Dictionary对象中,则可以使用如下方法获取它们:

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.
}
public static String GetPropertyValue(String objectName, String propertyName)
{
    try
    {
        var o = Objects[objectName];
        return GetPropertyValue(o, propertyName)
    }
    catch (Exception)
    {
        return null;
    }
}
以前的答案(现在已删除)是我想要的:“复制构造函数”是可能的,它将另一个相同类型的对象作为参数

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

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

我不想调用父类构造函数;我想传入一个已经构造好的父对象作为参数。前面的回答提到了“复制构造函数”,这是我不确定是否存在的;它现在似乎已经被删除了,但这是我一直在寻找的答案。谢谢,谢谢你的建议。name参数是对象的名称,比如“fish”,特征可以是“size”、“color”。(所以功能是一本字典)。因此,额外的特征始终是相同的特征,但可以采用不同的值。由于特性列表在其他方面是静态的,所以我希望为具有标准特性列表的对象和具有扩展列表的对象提供不同的类。这似乎是一种合理的结构方式吗?(对于列表和字典的混淆,我深表歉意-我在头脑中使用了“列表”的非编程定义,这对我没有帮助。)
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;
}