C#中继承(”子承父业“)

  开门见山!首先来说一下C#继承的规则吧!

  1.   继承是可以传递的。。。相信这个就不容多说
  2. 派生类是对基类的拓展,既然是拓展  那么就不能移除已经继承的成员的定义。就是可以添加新的成员
  3. 构造函数和析构函数不能被继承
  4. 如果我在儿子类中定义了与继承而来的成员同名的新成员,那么就可以覆盖父类的这些成员
  5. 定义虚方法、虚属性等,它的派生类能够重载这些成员,从而使类可以展示出多态性
  6. 派生类只能从一个类中继承,可以通过接口来实现多重继承

废话咋那么多呢,直接来代码说明部分问题!

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等关键字。。。。。。
  这亮点缺一不可额

 

 

posted @ 2013-03-06 20:07  四条眉毛  阅读(320)  评论(0编辑  收藏  举报