C# 继承 接口 多继承 
谁讲讲哈.
怎样继承窗口?
怎样继承方法?
怎样继承属性?
怎样继承多个基类?是否可以?是否要用接口?
接口是怎样的?

解决方案 »

  1.   

    先考虑包含关系,然后考虑继承关系,当继承变得不够灵活的时候考虑把公共的部分抽出来作为接口。
    1。包含关系:
    class body{/*some operate and member variables*/}
    class human
    {
         private body m_Body;
         //这里就需要包含一个body,而不是继承
    }class leg : body
    {
        //腿就要继承自body,并不是一定的说腿是身体,所以就要继承,当然 xx is yy 是个条件,但还有一点是因为包含body的话,我们要写很多函数来公布body的属性和方法
    }
      

  2.   

    C#中,派生类从它的直接基类中继承成员:方法、域、属性、事件、索引指示器。除了构造函数和析构函数,派生类隐式地继承了直接基类的所有成员。看下面示例: 
    using System ; 
    class Vehicle //定义交通工具(汽车)类 

    protected int wheels ; //公有成员:轮子个数 
    protected float weight ; //保护成员:重量 
    public Vehicle( ){;} 
    public Vehicle(int w,float g){ 
    wheels = w ; 
    weight = g ; 

    public void Speak( ){ 
    Console.WriteLine( "交通工具的轮子个数是可以变化的! " ) ; 

    } ; 
    class Car:Vehicle //定义轿车类:从汽车类中继承 

    int passengers ; //私有成员:乘客数 
    public Car(int w , float g , int p) : base(w, g) 

    wheels = w ; 
    weight = g ; 
    passengers=p ; 

    }    Vehicle 作为基类,体现了"汽车"这个实体具有的公共性质:汽车都有轮子和重量。Car 类继承了Vehicle 的这些性质,并且添加了自身的特性:可以搭载乘客。 
      

  3.   

    问一个具体点的.
    第一:我现在有类文件 main.cs 是写代码的.
    我在Form1里怎样继承?
    第二:我现在有类文件 main1.cs 和 main2.cs
    我在Form1里怎样继承?
      

  4.   

    Form1中不用继承吧?
    直接这样写:
    Main m = new Main();本身Form1继承自System.Windows.Forms.Form,他不可以再继承其他的类了。你要用main1.cs,那你直接用不就行了。
    private Main1 m1 = new Main1();
      

  5.   

    了解了.有没有不用new就可以用的方法?
    就像System.Windows.Forms :Form
    一样继承?
    或者做一个类库用using?
    能讲讲吗?
      

  6.   

    C#中,派生类从它的直接基类中继承成员:方法、域、属性、事件、索引指示器。除了构造函数和析构函数,派生类隐式地继承了直接基类的所有成员。看下面示例: 
    using System ; 
    class Vehicle //定义交通工具(汽车)类 

    protected int wheels ; //公有成员:轮子个数 
    protected float weight ; //保护成员:重量 
    public Vehicle( ){;} 
    public Vehicle(int w,float g){ 
    wheels = w ; 
    weight = g ; 

    public void Speak( ){ 
    Console.WriteLine( "交通工具的轮子个数是可以变化的! " ) ; 

    } ; 
    class Car:Vehicle //定义轿车类:从汽车类中继承 

    int passengers ; //私有成员:乘客数 
    public Car(int w , float g , int p) : base(w, g) 

    wheels = w ; 
    weight = g ; 
    passengers=p ; 

    }    Vehicle 作为基类,体现了"汽车"这个实体具有的公共性质:汽车都有轮子和重量。Car 类继承了Vehicle 的这些性质,并且添加了自身的特性:可以搭载乘客。
      

  7.   

    C#和VB的语法还是有很多差别的。VB中就不用定义就可以直接使用,其实这个做法是不对的。vb只是模拟出类的效果。对于不用new 而使用的就是public static 方法,类似于以前的全局方法。
      

  8.   

    1. 4 使用接口
    1.4.1为什么要使用接口
         接口其实很简单,就是提供一组方法而不提供实现,大家可能就会觉得接口没有什么用,而不使用或对接口敬而远之,使用接口可以统一编程接口,也就是说你可以改变实现而不用改变接口,通过接口也可以模拟多重继承,接口是可以被多重继承的,通过接口还可以实现多态。举个例子,如:IDisposable接口,上面提到如果一个类实现了该接口,就可以使用using块来释放资源了,其实就是把类型转换为IDisposable接口,然后调用Dispose方法,而不用管该对象到底是什么。归纳接口使用的好处有:
          1.统一编程接口
          2.模拟多重继承
          3.实现多态
    还有一个好处就是可以利用反射,实现插件的功能,先反射得到类型然后转换为预定的接口,就可以调用其中的方法了。这样就可以实现插件的功能。
    有这么多的好处,还有什么理由不用接口呢?
    1.4.2使用并正确的使用接口
    接口虽然的定义和使用是极为简单的:下面有个示例:
    class UseInterface
        {
            interface Iinstrument
            {
                void Play();
            }
            class Violin : Iinstrument
            {
                public void Play()
                {
                    Console.WriteLine("这是小提琴的演奏。");
                }
            }
            class Flute : Iinstrument
            {
                public void Play()
                {
                    Console.WriteLine("这是长笛的演奏。");
                }
            }
            static void CallFoo(Iinstrument instrument)
            {
                instrument.Play();
            }
            public static void Main(string[] args)
            {
                Violin v = new Violin();
                Flute f = new Flute();
                CallFoo(v);
                CallFoo(f);
                Console.ReadLine();
            }
        }
    可以看到接口使用极为简单也极为有用,但是要防止滥用和不正当的使用接口,不要认为接口是有好处的,就到处用使用接口,把多个不相干的方法置于同一个接口中,一个接口应该要有明确的职责,而不是一个杂货铺,把什么东西都置于其中,可以看看微软提供的接口,每个接口都是有明确的职责的,比如说
    前面提到的IDispose接口,里面只有一个Dispose接口,ICloneable中只有一个Clone方法。所以自己在编写接口时,把多个方法置于接口内,你应该问问自己那几个方法是否是有直接的关系。是否是做着同一件事。
    1.4.3接口还是抽象类
        在接口和抽象类中作出选择还真是有点难,接口和抽象类都是对实际类的抽象,接口是不提供任何实现的,抽象类可以提供实现也可以不提供,如果子类要从继承那儿获得好处,那就使用抽象类,应为接口是不会提供任何实现的,接口的抽象程度也不类要高,还有一个判断方法就是是“is a”还是“has a”即“是”还是“有”,如果是“is a”那么就应该选中抽象类,反之则选中接口。在不明确的情况下,应该要优先选用接口,而不是抽象类,特别是要插件和多态功能的尤其应该优先选用接口。
    1.4.4接口与多态
    前面说道接口的一个好处就是可以实现多态,多态的好处自不用多说,能够动态来识别而发出动作,当然是很有用处的,还拿上面的乐器的例子来讲多态,
    class UseInterface
        {
            interface Iinstrument
            {
                void Play();
            }
            class Violin : Iinstrument
            {
                public void Play()
                {
                    Console.WriteLine("这是小提琴的演奏。");
                }
            }
            class Flute : Iinstrument
            {
                public void Play()
                {
                    Console.WriteLine("这是长笛的演奏。");
                }
            }
            static void CallFoo(Iinstrument instrument)
            {
                instrument.Play();
            }
            public static void Main(string[] args)
            {
                Violin v = new Violin();
                Flute f = new Flute();
                CallFoo(v);
                CallFoo(f);
                Console.ReadLine();
            }
        }
    在CallFoo方法中传递的是个接口,在编译期并不具体指明是哪个类,只有到运行时,调用时才知道,它能够正确的调用其方法,这样就使得在运行的时候动态根据条件来决定调用哪个类个方法,这样就具有很大的灵活性。
       总结:应该积极使用接口,并在抽象类还是接口时优先选用接口。
      

  9.   

    static void CallFoo(Iinstrument instrument)
            {
                instrument.Play();
            }
    明明参数是接口,为什么还可以传入类阿
    还有为什么前面不能用public
      

  10.   

    楼上的问题没人能回答吗,我也想知道?而且,为什么要用static void CallFoo(Iinstrument instrument)
            {
                instrument.Play();
            }而不直接下面了
    public static void Main(string[] args)
            {
                Violin v = new Violin();
                Flute f = new Flute();
                v.play();   //这样不比CallFoo(v)省事吗?
                f.play();
            }
      

  11.   

    看书就不用到这里来问了为什么要用static void CallFoo(Iinstrument instrument)
            {
                instrument.Play();
            }而不直接下面了
    public static void Main(string[] args)
            {
                Violin v = new Violin();
                Flute f = new Flute();
                v.play();   //这样不比CallFoo(v)省事吗?
                f.play();
            }
      

  12.   


    因为需要使用接口的时候,一般都是没办法知道你所操作的对象是什么类的实例。你只能要求你的对象继承某一个接口。
    打个比方,如果你是老板,你手下有n个员工,你让你的秘书帮你找一个人来替你修电脑,这时候你不知道你的秘书会帮你找一个什么样的人来,因为你手下有很多个维修员,而且你也不知道他们叫什么名字,会什么技能。没关系,你知道你的秘书给你找来的肯定是维修员,而维修员一定会有修电脑这个技能。
    所以,你的命令就变成了,找一个维修员,修电脑。
    当然这个例子不是很好,用抽象类也一样可以实现这种效果。不过关于两者的区别35楼已经说的很好了,另外还有个区别就是用接口的话,你的员工可以身兼数职,比如这个员工可以既是维修员,同时还是一个操作员,或者还是一个管理员。
    ==============
    写到后面发现这个贴是ls挖出来的老坟了,BS下ls,另外为了我打这么多字,还是发出来了。