C#中继承(”子承父业“)
开门见山!首先来说一下C#继承的规则吧!
- 继承是可以传递的。。。相信这个就不容多说
- 派生类是对基类的拓展,既然是拓展 那么就不能移除已经继承的成员的定义。就是可以添加新的成员
- 构造函数和析构函数不能被继承
- 如果我在儿子类中定义了与继承而来的成员同名的新成员,那么就可以覆盖父类的这些成员
- 定义虚方法、虚属性等,它的派生类能够重载这些成员,从而使类可以展示出多态性
- 派生类只能从一个类中继承,可以通过接口来实现多重继承
废话咋那么多呢,直接来代码说明部分问题!
1、访问基类成员:Two方法 A、通过base.<方法名>() B、通过显示类型转换
class Program { static void Main(string[] args) { //base.sayhello();//这里是错误的,因为在静态方法中不能使用base关键字 childclass child = new childclass();//这里依次调用父类、子类构造函数 child.say(); child.sayhello();//这里是调用派生类中的sayhello()方法 ((parentclass)child).sayhello();//方法二:显示类型转换 //这里仍然调用是基类的方法额! } } public class parentclass { public parentclass() { Console.WriteLine("我是父类构造函数"); } public void sayhello() { Console.WriteLine("我是父类"); } } public sealed class childclass : parentclass { public childclass() { Console.WriteLine("我是子类构造函数"); } public void say() { base.sayhello();//方法一:通过base.<方法名>()调用父类的方法 } public new void sayhello()//这里隐藏了父类的sayhello方法额 { Console.WriteLine("道凡来了"); } }
运行结果如下:至于解释 代码中算是比较详细了! 给跪了 chen guan xi 敏感词 只有改了
2、密封类密封方法 刚刚接触的朋友可能会问,所以的类都可以被继承,那一直继承下去是不是太庞大了。。。。那么可不可以让某些类不被继承呢,答案肯定是可以的!
那就是在声明的时候使用sealed修饰符。OK 这样就解决问题了 EX:
public sealed class childclass : parentclass { public childclass() { Console.WriteLine("我是子类构造函数"); } public sealed void say() { Console.WriteLine("Hello Daofan"); } }
同理,如果在方法前加sealed修饰符,那么该方法就不能被重载!吼吼
3、抽象类和抽象方法 前面讲的是不被继承,那么抽象类和方法就是要求被继承。在C#中通过加入abstract来实现抽象类和方法。
值得注意的是:抽象类不能实例化,抽象方法没有具体执行代码,必须在非抽象的派生类中重写!所以可以得出 如果类中包括抽象方法,则类必须声明为抽象类!
class Program { static void Main(string[] args) { B b = new B();//实列化 在这里不能 A a=new A();额 抽象类不能被实列化额 亲 b.Hello(); } } public abstract class A { public A() { Console.WriteLine("抽象类父类构造函数"); } public abstract void Hello(); } public class B : A { public B() { Console.WriteLine("抽象类子类构造函数"); } public override void Hello() { Console.WriteLine("我是重写的子类的"); } }
但是我在想要是不使用抽象类呢,但是我想在派生类中重写实现功能,那么我们可以把方法声明为虚函数(Virtual)的形式来实现方法的重写!(这里注意和New关键字的区别,new是隐藏基类方法,并且是在派生类方法使用该关键字。而virtual是基类方法中使用virtual,子类方法中使用override)代码就不来了!
4、疑问:如果我要多个类继承呢,但是C#之允许继承一个基类啊。。。这不科学。 额 哈哈 吼吼 但是C#允许类派生与多个接口额。。。。哈哈 接口技术相当的不错的!
首先来段代码:
class Program { static void Main(string[] args) { Iface3 if3 = new Iface3(); ((If1)if3).hello(); ((If2)if3).hello(); if3.world(); if3.helloworld(); } } interface If1 { void hello(); void world(); } interface If2 { void hello(); void helloworld(); } class Iface3 : If1, If2 { void If1.hello() { Console.WriteLine("我是If1的hello"); } public void world() { Console.WriteLine("我是If1的world"); } void If2.hello() { Console.WriteLine("我是If2的hello"); } public void helloworld() { Console.WriteLine("我是If2的helloworld"); } }
在这里我们需要主要的是:在接口的实现部分必须注意
A、有相同名称的方法在实现时,前面不能加public等关键字,每个方法前必须加上相应的接口名
B、对于不同名称的方法,前面必须加public等关键字。。。。。。
这亮点缺一不可额