请问,我未来要写几十个类,不过这些类大部分格式都差不多,只是功能上略有不同。
比如,他们都有如下的属性:public string 执行前的信息{get;set;}
public string 执行后的信息{get;set;}
public bool 执行是否成功{get;set;}
public int 执行次数{get;set;}
public int 受影响数{get;set;}
public XmlNode 执行后的报告{get;set;}
...
...等等这类属性,我不想每个类里都将上面的东西写一次,有没有办法可以避免这么做?比如我现在的做法是:public abstract ClassA{}//这个类里存放的就是很多上面那些重复的东西,然后每个新建类里:
public class ClassA:ClassA{} //继承楼上的ClassA,这样就不用每个新建类都写一次了。我的第一个问题是,我这种做法对吗?如果说到这里大家听懂了,那么我继续:
可是有时候并不是所有类都需要上面的属性,有些类只用到其中的2、3个属性而已,但是继承 ClassA 会把所有的属性都继承了。我的第二个问题是,有没有办法可以较为灵活地选择想要继承的属性呢?说的可能有点糊涂,希望大家耐心询问,谢谢。

解决方案 »

  1.   

    1.对
    2.可以A派生B,C可以选择从A或B派生。
      

  2.   

    你可以使用接口
    或者用继承 虚拟函数 virtual 来实现,被继承的不一定要实现这个函数 需要用到的再overrite
      

  3.   

    组合优于继承,按你的需求,建议你选择组合,而不是做继承你可以新建一个或几个包含公共属性的类,在需要的类里面,组合使用.
        public class A
        {
            public int IntValue { get; set; }
            public string StringValue { get; set; }
        }    public class B
        {
            public List<int> IntList {get;set;}
            public List<string> StringList { get; set; }
        }    public class CompositeClassA
        {
            public A ObjectA { get; set; }
            public B ObjectB { get; set; }
        }    public class CompositeClassN
        {
            public A ObjectA1 { get; set; }
            public A ObjectA2 { get; set; }
            public B ObjectB1 { get; set; }
            public B ObjectB2 { get; set; }
        }
      

  4.   


    请问可以详细解释下吗?
    比如我有个下面3个类:public class A1{} // 该类需要用到 IntValue、StringValue 属性
    public class A2{} // 该类只需要用到 IntValue 属性
    public Class A3{} // 该类需要用到 IntValue、IntList 属性那么按照你的方法,该怎么做呢?
      

  5.   

    看来很多人对动态还不了解。给一个微软的例子:http://msdn.microsoft.com/en-us/library/ee461504.aspx注意看:
    public List<string> GetPropertyValue(string propertyName,
                                         StringSearchOption StringSearchOption = StringSearchOption.StartsWith,
                                         bool trimSpaces = true)
    在这里动态获得调用的属性名,你可以处理。dynamic rFile = new ReadOnlyFile(@"..\..\TextFile1.txt");
    foreach (string line in rFile.Customer)
    {
        Console.WriteLine(line);
    }
    Console.WriteLine("----------------------------");
    foreach (string line in rFile.Customer(StringSearchOption.Contains, true))
    {
        Console.WriteLine(line);
    }这个是客户端代码,很明显Customer这个属性不是某个类定义的,它完全是动态产生的。
      

  6.   

    用于组合的"组件类",需要你自己做适当的抽象,而不能生搬硬套.
    我给你例子中的类定义,并不适合你要求的A1,A2,A3.
      

  7.   


    正解组合:就是把一个类作为另一个类的属性!如果你有系列属性(A1-A10),很多过类都要使用
     public class A
        {
            public int A1 { get; set; }
    public int A2 { get; set; }
    ...
            public string A10 { get; set; }
        }    public class B
        {
            public List<int> IntList {get;set;}
            public List<string> StringList { get; set; }
            public A {get; set;}; // 这句是组合。这样就可以访问A 的所有公共属性!
        }
    像你的问题,可以把所有类到要用的属性封装在一个类(如:A)里。一些类(如:x,y,z)要所有的共同属性封装到类(如:B)你的所有类都包含(组合) 类A
    x,y,z 类,再多包含(组合) 类B