1、virtual方法在类设计中起什么作用啊(也就是为什么要把方法定为虚拟的)
2、virtual方法可以直接使用吗?它有方法体啊
3、virtual方法必须在子类中重写吗?如可以不重写,那么子类可以这个virtual方法吗?
2、virtual方法可以直接使用吗?它有方法体啊
3、virtual方法必须在子类中重写吗?如可以不重写,那么子类可以这个virtual方法吗?
解决方案 »
- 求能去掉字符串中所有字母的正则表达式
- 请问如何把treeview1的所有节点赋给treeview2并显示?
- c# RichTextBox怎样设置背景透明?
- 想做一个登陆软件 show() 和showdialog()的时候遇到了困难 请大家帮助 谢谢!
- 关于输入长度的问题
- 关于C#调用外部DLL时数据类型封送的问题
- 求高人指点
- MS Agent困扰很久
- 使用5种不同的方法加载水晶报表(Windows 窗体)(海波.NET)
- 关于Excel的问题
- 求标准的用GSM MODEM发送短信的at指令例子,我怎么测试都是error,在超级终端里面
- --==PDF打印==--itext在内存中生成pdf流后不想保存成文件,而是直接在页面上显示怎么搞阿?
如果声明一个方法的时候用了virtual这个关键字,那么,在派生类中,就可以使用override或者new关键字来重写(弃用)它或是隐藏(忽略)它.
如果你在父类中用了virtual这个关键字,而在其派生类中又没有用override或new关键字,而直接引用一个同名方法的话,编译器将会报警告错误,并将以new方式,即忽略派生类中的方法的方式来运行。
废话少说,还是以代码说话:
/// <summary>
/// 抽象类书
/// </summary>
public abstract class Book
{
/// <summary>
/// 书名
/// </summary>
public string bookName;
/// <summary>
/// 虚方法,获取书名
/// </summary>
public virtual string getBookName()
{
return "这本书名是:"+bookName;
}
/// <summary>
/// 虚方法,获取书出版社
/// </summary>
public virtual string getBookCome()
{
return "cn-web.com出版<br>";
}
}
/// <summary>
/// 书的派生类
/// </summary>
public class NetBook : Book
{
/// <summary>
/// 重写虚方法override
/// </summary>
public override string getBookName()
{
return bookName;
}
/// <summary>
/// 不用override,可以不写new,但会引起警告错误,编译时系统会自动为它加上new关键字
/// </summary>
public string getBookCome()//正规应当为:public new string getBookCome(),在这里省略了new关键字
{
return "www.cn-web.com出版<br>";
}
}
调用:
public class test
{
public test()
{
NetBook myNetBook = new NetBook();
myNetBook.bookName = "asp.net开发案例<br>";
Response.Write(myNetBook.getBookName());
Response.Write(myNetBook.getBookCome());
Book myBook = new NetBook();
myBook.bookName = "asp.net基础开发<br>";
Response.Write(myBook.getBookName());
Response.Write(myBook.getBookCome()); } public static void Main()
{
test t = new test();
}
}
virtual 方法是程序程序多态表现形式的一种而
同一方法
在不同的类里面有不同的现实
2.说这些方法时最好说的能俗点,有例子说明为最好。
3.我同意一楼的方法
2、virtual方法可以直接使用吗?它有方法体啊
3、virtual方法必须在子类中重写吗?如可以不重写,那么子类可以这个virtual方法吗?1 virtual这种方法其实是抽像出了我们在类设计中共有的一些操作,为什么要把它设为虚的呢,因为在我们共同的父类中,这个方法具体是实现什么功能我们并不能现在就确定,这只能让我们的子类来继承并且实现它,因为这个子类可以继承并且实现它,其它子类也可以做这样的事,所以很多类都要有这个功能,但具体的实现细节不同,所以我们把它放到一个共同的基类中,让我们的子类来继承实现,具体的不同就是让子类来实现自己的操作。
2,如果这个虚方法出来在一般的类中并且实现了功能那就可以在实例中直接使用,如果出现在抽象类中,那就不能真接使用了,因为抽象类不能用NEW()来创建,这有点像C++中的纯虚函数。
3 可以不在类中重写,如果不重写好它还是一个虚方法,在一般类中声明的虚方法是可以真接使用的
2、virtual方法可以直接使用,和普通方法一样
3、不是必须重写的. 子类可以使用base.方法 的方式调用, 无论有没有在子类使用override去重写virtual关键字只是明确标示此方法可以被重写, 其实它和一般的方法没有什么区别
相应的
sealed关键字标示此方法不可以被重写
如果子类里的方法和父类的内部实现不同,那么就去override这个方法。反之,如果子类中的实现方式和父类一样,那就直接使用继承自父类的方法就ok了。
在子类中总是可见,而且不能被替换或修改。
如果这个方法在子类中需要不同的执行。那就加virtual加关键字。
{
public void A()
{
//执行步骤A
} public virtual void B()
{
//执行步骤B
} public void C()
{
//执行步骤C
} public void Run()
{
A();
B(); //步骤B是扩展点 ,可以由子类决定具体执行什么
C();
}
} public class FlowA:Flow
{
public override void B()
{
//执行FlowA的B步骤
}
} public class FlowB : Flow
{
public override void B()
{
//执行FlowB的B步骤
}
}FlowB flowB = new FlowB();
flowB.Run(); //复用了Flow的流程并采用了自己的B步骤
不知道这样讲楼主是不是清楚些了.
总结意思就是virtual 就是为了子类的override,但是也可通过base.function()调用
和抽象方法的相同点是都用了override关键字,
不同点是抽象方法必须存在于抽象类中,而子类必须重写,除非子类也是抽象的。其它:
在JAVA中是没有虚方法的。在JAVA中,是通过注解@override来达到类似的目的。两种技术的相同点:
没有这种技术,则子类写的方法可能会在不注意的情况下重写了父类的方法。