解决方案 »
- C# 图片转换成二进制,二进制转换图片的问题
- 请问下treeView控件进行表中数据显示,一般是一条条绑定上,还是先将数据取出暂存Xml文件后直接绑定这个xml文件呢?
- 如何用Visual C#画坐标及函数曲线
- 在Socket编程中用多线程和异步,哪一种方式效率更高点?up有分
- 在c# winform!中如何自定义打印模板,让客户在程序中自己设计打印模板?高分,在线等!!!
- 请教我用C#连接Oracle老是提示命名空间System.Data中不存在OracleClient(!急!!拜托了)
- 刚结贴,又来一个问题,datagrid在同一个页面内变换
- 【求助】如何获得计算机能耗,耗电量等
- C# 获得 ProcessThread 操作系统进程线程 对象
- 一个有关ICodeCompiler接口的方法CompileAssemblyFromSource的问题。
- !急!]附加成功的数据库无法在vs中连接。求解决!
- C#做界面时使用DevExpress的chartcontrol控件怎么在不同的pane里放series呢
这是多态的概念,你看懂了面向对象的多态,你的问题就明白了
因为子类是new DoSomething不是 override DoSomething
那么这句就解释的通了
MyBaseClass Base = new MyDerivedClass();
//MyDerivedClass is a MyBaseClass,所以可以用MyBaseClass声明MyDerivedClass
举个例子,一个抽象类Cars
子类BMW、Benz、Ferrari都继承了父类Cars
那么此时都可以用Cars声明子类
如:
Cars bmw=new BMW();
Cars benz=new Benz();
Cars Ferrari=new Ferrari();
看下面向对象的多态...
Base.DoSomething();
这句就涉及到重写和隐藏的区别了。如果DerivedClass里的DoSomething方法是override父类的DoSomething,那么就是调用DerivedClass内的DoSomething,如果是new父类的DoSomething,那么就是调用BaseClass内的DoSomething
MyDerivedClass Derived = new MyDerivedClass();
Base.DoSomething();//如果是的,那为什么调用这个方法会是调用MyBaseClass的方法?
Derived.DoSomething();第一句,是将子类对象转成父类,因为子类转父类是安全的,所以不用显式转换;
第三句,是父类方法,base关键字表示是父类;
第四句,子类用了关键字new,所以,这里的方法不是父类的方法。
MyDerivedClass Derived = new MyDerivedClass(); //子类实例化,完全子类功能可用
Base.DoSomething(); //因为未重写,所以调用的是父类的实现
Derived.DoSomething(); //调用子类自身的实现(因为new父类被覆盖)
/// 建立的虚方法,可以在子类中被重写
/// </summary>
class Operation
{
public virtual double operation(int x,int y)
{
return x * y;
}
}
/// <summary>
/// 在子类中重写虚方法
/// </summary>
class Addition : Operation
{
public override double operation(int x, int y)
{
return (x + y);
}
} private void Form1_Load(object sender, EventArgs e)
{
comboBox1.SelectedIndex = 0;
} private void txtNum1_KeyPress(object sender, KeyPressEventArgs e)
{
if (!(e.KeyChar <= '9' && e.KeyChar >= '0') && e.KeyChar != '\r' && e.KeyChar != '\b')
{
e.Handled = true;
}
}
private void txtNum2_KeyPress(object sender, KeyPressEventArgs e)
{
if (!(e.KeyChar <= '9' && e.KeyChar >= '0') && e.KeyChar != '\r' && e.KeyChar != '\b')
{
e.Handled = true;
}
}
private void button1_Click(object sender, EventArgs e)
{
if (txtNum1.Text == "" || txtNum2.Text == "")
{
MessageBox.Show("请输入数字", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
if (comboBox1.SelectedIndex == 0)
{
Operation multiplication = new Operation();//原始虚方法进行乘法运算
txtResult.Text = multiplication.operation(Convert.ToInt32(txtNum1.Text.Trim()), Convert.ToInt32(txtNum2.Text.Trim())).ToString();
}
else
{
Operation Addition = new Addition();
txtResult.Text = Addition.operation(Convert.ToInt32(txtNum1.Text.Trim()), Convert.ToInt32(txtNum2.Text.Trim())).ToString();
}
}//CodeGo.net中的
}
因为子类的DoSomething()是new的一个方法和父类的没继承关系。去掉new, 改为override 上面就是执行子类的方法了