问题描述:
    有一个用户控件的基类,有许多公用属性.派生了30个类希望在实例化时初始化基类的属性
    如何做更好? 
这样做行吗?
 public class Base:UserControl
   {
      private string a;
      private string b;
      .
      .
      .
      public string a1
     {      get{return a;} set{a=value;}
     }
      public string b1
     {      get{return b;} set{b=value;}
     }
      .
      .
      .
      public Base(string aa,string bb....)
      {
         a1=aa;
         b1=bb;
      }
   }public class child1:Base
{
      public child1(string aa,string bb....):base(aa,bb...)
}public class main
{
   string aa,bb....
  child1=new child1(aa,bb....) //还有没有更好的,太烦了嘛.
  child2=new child2(aa,bb....)
  .
  .
  .
}

解决方案 »

  1.   

    老天,感觉你的类设计有问题,而且带参数的用户控件的构造函数并不是推荐的方法,而且考虑到你的属性都是可读写的仔细研究一下你的这些类,看他们有哪些属性是共享而且有共同数值的,在其中生成一些基类对属性赋值,或者都是字符串类的话,考虑使用一个hashtable
      

  2.   

    如果你只通过constructor初始化的话,那子类还能有什么好的办法?一般的初始化,就3种,从constructor或用一个单独的初始化方法或给属性赋值,从constructor传进去那些一个完整对象必须的参数,其他的通过属性和方法来设置我再重复一遍,看看这些属性是不是都需要从子类开始初始化的,每个子类需要初始化的数据都不一样么?基类是不是可以在constructor自动初始化某些属性,那样,就可以减少constructor所需要传递的变量数我的感觉是你的类设计得不太好,别从一个计算机科学或语言的角度来解决这问题,从你自己的问题来仔细分析,如果你提供细节的话,我们也许可以进一步提供帮助
      

  3.   

    思归:对,我看了一下,每个子类需要初始化的数据都有一样的.现在我把基类某些
    构造函数的某些参数给移除了.改成了给属性附值. 
    那怎样实例化子类对象呢!?Base childA=new child1() 行吗!? 能否给个小例子.
      

  4.   

    就是这样实例化啊:Base childA=new child1();然后
    childA.属性A = 值A;
    childA.属性B = 值B;
    childA.属性C = 值C;
    ......
      

  5.   

    public class baseC
    {
      public string SomeProp
      {
        //....
      }  public baseC()
      {
           SomeProp = "abc"; //if const value
      }  public baseC(string s)
      {
             SomeProp = s;
      }
    }public class ChildC : baseC
    {
       public ChildC()
       {
         //after this, SomeProp will have "abc";
       }   public ChildC():base("def")
       {
           //after this, SomeProp will have "def";
       }
    }
      

  6.   

    1. 如果是静态初始化,也就是说某个属性有一个常数量的初始值,你可以像这样:
    private string property1 = "abc";
    public string Property1
    {
      get
      {
        return this.property1;
      }
    }2. 如果是动态初始化,也就是说创建每个类实例的时候都想让属性有不同的初始值,那么可以在构造函数中加上传进来的初始值,也可以写个函数来初始化所有需要初始化的属性:
    private string property1 = "";
    private string property2 = "";public string Property1
    {
      get
      {
        return this.property1;
      }
    }
    public string Property2
    {
      get
      {
        return this.property2;
      }
    }构造函数法:
    public BaseClass(string property1, string property2)
    {
      this.property1 = property1;
      this.property2 = property2;
    }
    BaseClass cls = new BaseClass("a", "b");用函数初始化:
    public BaseClass()
    {
    }
    public void InitialValue(string property1, string property2)
    {
      this.property1 = property1;
      this.property2 = property2;
    }
    BaseClass cls = new BaseClass();
    cls.InitialValue("a", "b");