supegong  

继承的类型:

实现继承:表示一个类型派生于一个基类型,拥有该基类型的所有成员字段和函数。可以在派生类型的定义中重写该函数的实现代码。在需要给现有的类型添加功能,或许多相关的类型共享一组重要的公共功能时,这种类型的继承是非常有效的。

接口继承:表示一个类型只继承了函数的签名,没有继承任何实现代码。接口继承常常被看做提供了一种契约:让类型派生于接口,来保证为客户提供某个功能。例如,某些类型可以指定从接口System.IDisposable中派生,从而提供一种清理资源的方法Dispose()。

实现继承的声明

属性 类修饰符 class 派生类名:基类名 {类体}

base关键字:用于从派生类中访问基类成员,它有两种基本用法:

<1>在定义派生类的构造函数中,指明要调用的基类构造函数,

public Employee(string Name1, int Age, string D, decimal S)

            : base(Name1, Age)

<2>用基类中被派生类覆盖的方法。base.Display();

覆盖基类成员:用new关键字public new void Display()

类的多态性

<1>编译时的多态性:通过方法重载来实现的。

<2>运行时的多态性通过虚方法实现:在类的方法声明前加上了virtual修饰符,无论基类还是派生类,都调用同一个显示方法,根据对象不同,自动显示不同的信息。可以用虚方法来实现。

派生类对象也是其基类的对象,但基类对象却不是其派生类的对象。Person aPerson=

class Person

    {

        private String name = "张三";//类的数据成员声明

        private int age = 12;

       

        public void Display()//类的方法(函数)声明,显示姓名和年龄

        {

            Console.WriteLine("姓名:{0},年龄:{1}", name, age);                       

        }

        protected virtual void Display1()//类的虚方法

        {

            Console.WriteLine("姓名:{0},年龄:{1}", name, age);

        }

        static public void DisplayData(Person aPerson)//静态方法

        {          

            aPerson.Display1();//不是静态方法调用实例方法,如写为Display()错误           

        }          

 

        public Person(string Name, int Age)//构造函数,函数名和类同名,无返回值

        {

            name = Name;

            age = Age;           

        }

        public Person()//类的构造函数重载

        {

            name = "田七";

            age = 12;

        }

    }

 

    class Employee : Person//Person类是基类

    {

        private string department;//部门,新增数据成员

        private decimal salary;//薪金,新增数据成员

        public Employee(string Name1, int Age, string D, decimal S)

            : base(Name1, Age)

        {//注意base的第一种用法,根据参数调用指定基类构造函数,注意参数的传递           

            department = D;

            salary = S;

           

        }

        public new void Display()//覆盖基类Display()方法,注意new,不可用override

        {

            base.Display();//访问基类被覆盖的方法,base的第二种用法

            Console.WriteLine("部门:{0}  薪金:{1}", department, salary);

        }

       

        protected override void Display1()//重载虚方法,注意用override

        {

            base.Display();//访问基类同名方法

            Console.WriteLine("部门:{0}  薪金:{1} ", department, salary);

        }

 

    }

class Class1

    {

        static void Main(string[] args)

        {

            Person OnePerson = new Person("张三", 30);//生成类的对象     

            Employee OneEmployee = new Employee("李四", 30, "计算机系", 2000);

            Person TwoEmployee = new Employee("王五", 30, "财务", 2000);

 

            OnePerson.Display();

            OneEmployee.Display();

            TwoEmployee.Display();

 

            Person.DisplayData(OnePerson);//使用了virtual后只用一个方法即可

            Person.DisplayData(OneEmployee); //显示派生类数据  

            Person.DisplayData(TwoEmployee);

        }

    }

接口声明

public interface IExample

{//所有接口成员都不能包括实现

string this[int index] {get;set;}//索引指示器声明

event EventHandler E;//事件声明

void F(int value);//方法声明

string P { get; set;}//属性声明

}

声明接口时,需注意以下内容:

l         接口成员只能是方法、属性、索引指示器和事件,不能是常量、域、操作符、构造函数或析构函数,不能包含任何静态成员。

l         接口成员声明不能包含任何修饰符,接口成员默认访问方式是public。

 

接口继承

把引用变量声明为IBankAccount引用的方式。这表示它们可以指向实现这个接口的任何类的实例。但我们只能通过这些引用调用接口的方法-- 如果要调用由类执行的、不在接口中的方法,就需要把引用强制转换为合适的类型。

public interface IBankAccount

    {

        void PayIn(decimal amount);

        bool Withdraw(decimal amount);

        decimal Balance

        {

            get;

        }

    }

    public class SaverAccount : IBankAccount

    {

        private decimal balance;

        public void PayIn(decimal amount)

        {

            balance += amount;

        }

        public bool Withdraw(decimal amount)

        {

            if (balance >= amount)

            {

                balance -= amount;

                return true;

            }

            Console.WriteLine("Withdrawal attempt failed.");

            return false;

        }

        public decimal Balance

        {

            get

            {

                return balance;

            }

        }

        public override string ToString()

        {

            return String.Format("Venus Bank Saver: Balance = {0,6:C}", balance);

        }

    }

static void Main()

        {

            IBankAccount venusAccount = new SaverAccount();

            venusAccount.PayIn(200);

            venusAccount.Withdraw(100);

            Console.WriteLine(venusAccount.ToString());

           

        }

posted on 2011-02-24 16:21  supegong  阅读(389)  评论(0)    收藏  举报