我有一个包含字符串('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)使新班级成为旧班级的孩子,因为它只是一些额外的功能,我想保留方法
由于
答案 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;
}