基类与类型一起使用,可以一般分配吗?

时间:2013-12-05 19:53:05

标签: c#

假设以下代码:

 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,但它可以在对象实例之间变化。由于它们都继承了基类,我可以使用通用方法来分配这些公共属性吗?

4 个答案:

答案 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类中设置一个方法来设置属性String1String2 ......

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

但是你想要的东西似乎有些过分。我会选择托梅克的建议。