解决方案 »

  1.   

    随意拆分的意思是 :
    class3 cl = new class1();
    class3 c2 = new class2();
    ?? 
      

  2.   


    如果类型 A 和 B 分别继承自类型 C,面向对象最基本的原则之一就是“A和B的实例一定要能够放到所有关于C的测试中运行”。例如你把“鸭嘴兽和鸡”设计为“禽类”,那么必须保证鸭嘴兽必须“是”禽类,并且“鸡”也必须是禽类。那种为了编程“方便”而胡乱滥用继承,是错误的做法。讲不出面向业务领域的抽象含义而就胡乱“融合”是会搞错代码的,遇到这种(任意滥用继承的)bug时你的技术经理会直接让你下岗的,因为一眼就能看出程序经不起面向对象基本测试。
      

  3.   

    如果根本不具有抽象性质,那么“唯一的办法”就是只能用组合而不用继承。也就是说你的Class3中定义两个属性,其中一个声明为Class1,另一个声明为Class2。你可能慢慢地就觉得这种Class3是个“废话”了。确实是这样,GOF说的所谓“多用组合而少用继承”的话本身就是20年前蛊惑了许多程序员的话,但是它对于滥用继承的人也算是一个很好的警告。
      

  4.   


        public class A
            {
               public void write()
                {
                    Console.WriteLine("this is Class A");
                }        }
            public class B
            {
            
                public void write()
                {
                    Console.WriteLine("this is Class B");
                }
            }
            public class C
            {
                public C()
                {
                    this.a = new A();
                    this.b = new B();
                }
                public A a { get; set; }
                public B b { get; set; }
                public void write()
                {
                    Console.WriteLine("this is Class C");
                }
            }
            static void Main(string[] args)
            {         C c1 =new C();        
             c1.write();
             c1.a.write();
             c1.b.write();
             Console.ReadKey();
            }
      

  5.   

    类与类的关系:组合class class3
    class3(class1,class2)//构造函数来组合getClass1//用属性来拆分
    getClass2
      

  6.   

    通过继承计算梯形面积示例
     public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }        private void button1_Click(object sender, EventArgs e)
            {
                TrapeziaArea myclass = new TrapeziaArea();//实例化类对象
                myclass.SD = Convert.ToDouble(textBox1.Text);//为梯形的上底赋值
                myclass.XD = Convert.ToDouble(textBox2.Text);//为梯形的下底赋值
                myclass.Height = Convert.ToDouble(textBox3.Text);//为梯形的高赋值
                textBox4.Text = myclass.Area().ToString();//计算梯形面积
            }
        }    class Trapezia//自定义类
        {
            private double sd = 0;//定义int型变量,作为梯形的上底
            private double xd = 0;//定义int型变量,作为梯形的下底
            private double height = 0;//定义int型变量,作为梯形的高
            // 上底
            public double SD
            {
                get
                {
                    return sd;
                }
                set
                {
                    sd = value;
                }
            }
            // 下底
            public double XD
            {
                get
                {
                    return xd;
                }
                set
                {
                    xd = value;
                }
            }
            // 高
            public double Height
            {
                get
                {
                    return height;
                }
                set
                {
                    height = value;
                }
            }
        }
        // 自定义类,该类继承自Trapezia
        class TrapeziaArea : Trapezia
        {
            // 求梯形的面积
            // <returns>梯形的面积</returns>
            public double Area()
            {
                return (SD + XD) * Height / 2;
            }
        }
      

  7.   

    建议楼主把情况描述再具体一些。Class1 和Class2 分别是做什么的? 他们有没有共同的特征,放到一个Class3是否合适?再把情况具体描述一下,看看有没有更好的解决办法。
      

  8.   

    感觉楼上对于组合的说法.
    对于class1和class2,  可理解为动态数据模型和配置数据模型, 
    我做过一个简单测试, class1为普通类或者抽象类,Iclass2为接口,  class3同时继承class1和Iclass2,  声明一个class3的时候, 把class3的对象转化城class1,或者Iclass2的对象,其实是内部属性的隐藏, 本质上, 这个对象还是class3的对象. class Program
        {
            static void Main(string[] args)
            {            Info i = new Info() { ID=1 ,Name="loui"};            MongoData md = (MongoData)i;            /*这里的md数据,虽说数据类型上以转成MongoData, 其实他是个Info类型的, 只是对md 对象隐藏了Config 的属性.
                当我把md这个对象序列化存储到mongodb时, 其实我只想存MongoData 的数据结构体,而这时候储存的其实是Info的数据             结构体
                */
            }
        }    class MongoData
        {
            public string Name { get; set; }
        }
        interface Config
        {
            int ID { get; set; }
        }
        class Info : MongoData, Config
        {
            public int ID { get; set; }
        }不知我这次的描述是否详细.