先考虑包含关系,然后考虑继承关系,当继承变得不够灵活的时候考虑把公共的部分抽出来作为接口。 1。包含关系: class body{/*some operate and member variables*/} class human { private body m_Body; //这里就需要包含一个body,而不是继承 }class leg : body { //腿就要继承自body,并不是一定的说腿是身体,所以就要继承,当然 xx is yy 是个条件,但还有一点是因为包含body的话,我们要写很多函数来公布body的属性和方法 }
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 的这些性质,并且添加了自身的特性:可以搭载乘客。
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 的这些性质,并且添加了自身的特性:可以搭载乘客。
1。包含关系:
class body{/*some operate and member variables*/}
class human
{
private body m_Body;
//这里就需要包含一个body,而不是继承
}class leg : body
{
//腿就要继承自body,并不是一定的说腿是身体,所以就要继承,当然 xx is yy 是个条件,但还有一点是因为包含body的话,我们要写很多函数来公布body的属性和方法
}
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 的这些性质,并且添加了自身的特性:可以搭载乘客。
第一:我现在有类文件 main.cs 是写代码的.
我在Form1里怎样继承?
第二:我现在有类文件 main1.cs 和 main2.cs
我在Form1里怎样继承?
直接这样写:
Main m = new Main();本身Form1继承自System.Windows.Forms.Form,他不可以再继承其他的类了。你要用main1.cs,那你直接用不就行了。
private Main1 m1 = new Main1();
就像System.Windows.Forms :Form
一样继承?
或者做一个类库用using?
能讲讲吗?
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 的这些性质,并且添加了自身的特性:可以搭载乘客。
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方法中传递的是个接口,在编译期并不具体指明是哪个类,只有到运行时,调用时才知道,它能够正确的调用其方法,这样就使得在运行的时候动态根据条件来决定调用哪个类个方法,这样就具有很大的灵活性。
总结:应该积极使用接口,并在抽象类还是接口时优先选用接口。
{
instrument.Play();
}
明明参数是接口,为什么还可以传入类阿
还有为什么前面不能用public
{
instrument.Play();
}而不直接下面了
public static void Main(string[] args)
{
Violin v = new Violin();
Flute f = new Flute();
v.play(); //这样不比CallFoo(v)省事吗?
f.play();
}
{
instrument.Play();
}而不直接下面了
public static void Main(string[] args)
{
Violin v = new Violin();
Flute f = new Flute();
v.play(); //这样不比CallFoo(v)省事吗?
f.play();
}
因为需要使用接口的时候,一般都是没办法知道你所操作的对象是什么类的实例。你只能要求你的对象继承某一个接口。
打个比方,如果你是老板,你手下有n个员工,你让你的秘书帮你找一个人来替你修电脑,这时候你不知道你的秘书会帮你找一个什么样的人来,因为你手下有很多个维修员,而且你也不知道他们叫什么名字,会什么技能。没关系,你知道你的秘书给你找来的肯定是维修员,而维修员一定会有修电脑这个技能。
所以,你的命令就变成了,找一个维修员,修电脑。
当然这个例子不是很好,用抽象类也一样可以实现这种效果。不过关于两者的区别35楼已经说的很好了,另外还有个区别就是用接口的话,你的员工可以身兼数职,比如这个员工可以既是维修员,同时还是一个操作员,或者还是一个管理员。
==============
写到后面发现这个贴是ls挖出来的老坟了,BS下ls,另外为了我打这么多字,还是发出来了。