假设以下代码:
public class Shared
{
public string String1 { get; set; }
}
public class ImplementedOne : Shared{}
public class ImplementedTwo : Shared{}
public T SetBaseProperties<T>(Shared shared)
{
// go through and assign, return type ImplementedOne or ImplementedTwo
}
我有两个继承自Shared,ImplementedOne和ImplementedTwo的对象。其中每个都使用属性String1,但它可以在对象实例之间变化。由于它们都继承了基类,我可以使用通用方法来分配这些公共属性吗?
答案 0 :(得分:3)
如果您正在寻找初始化String1
属性的地方,那么它应该在基类构造函数中
public class Shared
{
public string String1 { get; set; }
public Shared(string str)
{
String1 = str;
}
}
而不仅仅是
public class ImplementedOne : Shared
{
public ImplementedOne() : base("your string")
{
}
}
答案 1 :(得分:1)
我建议在Shared
中实现一个方法来设置其属性:
public class Shared
{
public void SetProperties( Shared shared )
{
this.String1 = shared.String1;
}
}
或者为Shared
创建一个由派生类的构造函数调用的复制构造函数,这些构造函数接受Shared
的实例(这是我首选的方法):
public class Shared
{
public Shared( Shared source )
{
this.String1 = source.String1;
}
}
public class ImplementedOne : Shared
{
public ImplementedOne( Shared source ) : base( source )
{
}
}
更新
我可能误解了你的问题 - 如果你问如何为每个派生类型的实例为一个属性分配一个属性,我会将属性设为虚拟并按类进行实现:
public class Shared
{
public virtual string String1 { get { return "Shared's string"; } }
}
public class ImplementedOne : Shared
{
public override string String1 { get { return "ImplementedOne's string"; } }
}
public class ImplementedTwo : Shared
{
public override string String1 { get { return "ImplementedTwo's string"; } }
}
答案 2 :(得分:0)
我认为你错过了关于泛型的观点......
在您的特定情况下,您只需要在Shared
类中设置一个方法来设置属性String1
,String2
......
public class Shared
{
public string String1 { get; set; }
public SetBaseProperties()
{
// go through and assign, return type ImplementedOne or ImplementedTwo
}
}
您可以在ImplementationX
班级
var implementation1 = new Implementation1();
implementation1.SetBaseProperties();
虽然,当然,这是你可以把它放在一个建设者,
public class Shared
{
public Shared()
{
this.SetBaseProperties();
}
public string String1 { get; set; }
public SetBaseProperties()
{
// go through and assign, return type ImplementedOne or ImplementedTwo
}
}
答案 3 :(得分:0)
如果您真的想使用通用方法修改类型,可以使用通用约束。
public T SetBaseProperties<T>(T object) where T : Shared
{
object.String1 = "value";
return object;
}
但是你想要的东西似乎有些过分。我会选择托梅克的建议。