C#继承、覆盖和多态、抽象类
来源:互联网 发布:彩票源码程序 编辑:程序博客网 时间:2024/03/28 18:23
//-----------------------------------------------------------------继承-------------------------------------------
//myClass.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace myClass
class myFirst{
int value_myFirst;
public myFirst(int f)
{
value_myFirst = f;
}
}
class mySecond : myFirst{
int value_mySecond;
//构造函数传递参数时,采用base关键字,s在base()中不需重新声明类型int
public mySecond(int s)
: base(s)
{
value_mySecond = s;
}
}
class Program
{
static void Main(string[] args)
{
}
}
}
//-----------------------------------覆盖与多态----------------------------------------
//myClass.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace myClass
{
class myFirst
{
int value_myFirst;
public myFirst(int f)
{
value_myFirst = f;
}
public void f1()
{
System.Console.WriteLine("myFirst.f1()!");
}
public virtual void f2() //virtual也可以提到最前面
{
System.Console.WriteLine("myFirst.f2()!");
}
}
class mySecond : myFirst
{
int value_mySecond;
public mySecond(int s)
: base(s)
{
value_mySecond = s;
}
//使用关键字new覆盖基类中的同名方法
public new void f1() //new也可以提到最前面
{
System.Console.WriteLine("mySeconde.f1()!");
}
//error当基类函数myFirst.f1()没有声明为virtual,abstract时不能override!
//public override void f1()
//{
// System.Console.WriteLine("mySeconde.f1()!");
//}
//基类函数中虽然声明是virtual,但是仍然可以用new覆盖。
//public new void f2()
//{
// System.Console.WriteLine("mySeconde.f2()!");
//}
////基类函数中虽然声明是virtual,用override覆盖。
public override void f2() //override也可以提到最前面
{
System.Console.WriteLine("mySeconde.f2()!");
}
}
class Program
{
static void Main(string[] args)
{
myFirst mf = new myFirst(1);
mySecond ms = new mySecond(2);
mf.f1(); //myFirst.f1()!
mf.f2(); //myFirst.f2()!
ms.f1(); //mySeconde.f1()!
ms.f2(); //mySeconde.f2()!
mf = ms; //向上转型之后
mf.f1(); //myFirst.f1()!
//mySeconde.f2()! 这是用override的运行结果;
//如果是new那么,结果是myFirst.f2()!
mf.f2();
}
}
}
//C#基类方法要声明为virtual,派生类覆盖时要用override;
//-----------------------------------抽象类----------------------------------------------------
上面已经说明,虽然基类方法声明为virtual,以便派生类用override覆盖,但是派生类仍然可以用
new关键字覆盖(不具有多态性)。
可以强制让派生类覆盖基类的方法,将基类方法声明为抽象的,采用abstract关键字。
抽象方法没有方法体,由派生类来提供。
如果派生类不实现基类的抽象方法,则派生类也需要声明为abstract类
//myClass.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace myClass{
//类中只要存在抽象方法,就必须声明为抽象类
abstract class myFirst
{
int value_myFirst;
public myFirst(int f)
{
value_myFirst = f;
}
//抽象方法没有方法体,以分号结尾。
public abstract void f1();
public void f2()
{
System.Console.WriteLine("myFirst.f2()!");
}
public virtual void f3()
{
System.Console.WriteLine("myFirst.f3()!");
}
}
class mySecond : myFirst
{
int value_mySecond;
public mySecond(int s)
: base(s)
{
value_mySecond = s;
}
//覆盖基类抽象方法
public override void f1()
{
System.Console.WriteLine("mySeconde.f1()!");
}
//覆盖基类一般方法
public new void f2()
{
System.Console.WriteLine("mySeconde.f2()!");
}
//覆盖基类虚拟方法
public override void f3()
{
System.Console.WriteLine("mySecond.f3()!");
}
}
class Program
{
static void Main(string[] args)
{
//抽象类和接口不能声明对象
//myFirst mf = new myFirst(1);
mySecond ms = new mySecond(2);
ms.f1(); //mySeconde.f1()!
ms.f2(); //mySeconde.f2()!
ms.f3(); //mySecond.f3()!
//这里向上转型采用强类型转换的方式
((myFirst)ms).f1(); //mySeconde.f1()!
((myFirst)ms).f2(); //myFirst.f2()!
((myFirst)ms).f3(); //mySecond.f3()!
}
}
}
- C#继承、覆盖和多态、抽象类
- 黑马程序员--继承,覆盖,抽象类,和多态
- 黑马程序员--继承,覆盖,抽象类,和多态
- c#语言-抽象类(People)的继承,方法覆盖
- C#中的继承 (继承、抽象类和抽象方法、接口)
- C#中的继承 (继承、抽象类和抽象方法、接口)
- Java,C#,C++在继承,覆盖和多态,抽象类等几个方面的比较归纳
- Java,C#,C++在继承,覆盖和多态,抽象类等几个方面的比较归纳
- Java,C#,C++在继承,覆盖和多态,抽象类等几个方面的比较归纳
- Java,C#,C++在继承,覆盖和多态,抽象类等几个方面的比较归纳
- Java,C#,C++在继承,覆盖和多态,抽象类等几个方面的比较归纳
- 继承和多态、接口、抽象类
- 继承、多态和抽象类
- C#的抽象类和方法,重载,覆盖,隐藏
- 【C#】C#中的继承 (继承、抽象类和抽象方法、接口)
- java 继承和多态 抽象类和接口
- c#继承(抽象类、接口)
- 黑马程序员_JavaSE基础知识总结八:继承、覆盖、抽象类和接口
- 使用VC2005express,时,MFC遇到的问题
- 程序员
- Linux: 3322.org+lynx+crontab 实现ddns的自动刷新
- Linux下GCC编程四个过程(转)
- 值类型和引用类型的区别
- C#继承、覆盖和多态、抽象类
- Create Jffs2 for Linux Kernel 2.6
- C++类中的访问控制
- 客户化开发的功能主菜单丢失的问题。
- 三步学会Java Socket编程
- Linux系统信息查看命令大全
- 代码实现接口抽象类
- 什么样的域名能卖出去并卖个好价格
- OpenMP学习之--任务划分与调度(代码示例)