interface IControl
{
void Paint();
}
class Control : IControl
{
public void Paint() { Console.WriteLine("Control"); }
}
class TextBox : Control
{
new public void Paint() { Console.WriteLine("TextBox"); }
}class App
{
static void Main()
{
Control c = new Control();
TextBox t = new TextBox();
IControl ic = c;
IControl it = t;
c.Paint();
t.Paint();
ic.Paint();
it.Paint(); //为什么调用Control类的Paint方法
}
}interface IControl
{
void Paint();
}
class Control : IControl
{
public void Paint() { Console.WriteLine("Control"); }
}
class TextBox : Control
{
new public void Paint() { Console.WriteLine("TextBox"); }
}class App
{
static void Main()
{
Control c = new Control();
TextBox t = new TextBox();
IControl ic = c;
IControl it = t;
c.Paint();
t.Paint();
ic.Paint();
it.Paint(); //为什么调用Control类的Paint方法
}
}
interface IControl
{
void Paint();
}
class Control : IControl
{
public virtual void Paint() { Console.WriteLine("Control"); }
}
class TextBox : Control
{
override public void Paint() { Console.WriteLine("TextBox"); }
}class App
{
static void Main()
{
Control c = new Control();
TextBox t = new TextBox();
IControl ic = c;
IControl it = t;
c.Paint();
t.Paint();
ic.Paint();
it.Paint(); //为什么调用TextBox类中的Paint方法
}
}========================================================================
应该怎么进行分析呢
{
void Paint();
}
class Control : IControl
{
public void Paint() { Console.WriteLine("Control"); }
}
class TextBox : Control
{
new public void Paint() { Console.WriteLine("TextBox"); }
}class App
{
static void Main()
{
Control c = new Control();
TextBox t = new TextBox();
IControl ic = c;
IControl it = t;
c.Paint();
t.Paint();
ic.Paint();
it.Paint(); //为什么调用Control类的Paint方法
}
}interface IControl
{
void Paint();
}
class Control : IControl
{
public void Paint() { Console.WriteLine("Control"); }
}
class TextBox : Control
{
new public void Paint() { Console.WriteLine("TextBox"); }
}class App
{
static void Main()
{
Control c = new Control();
TextBox t = new TextBox();
IControl ic = c;
IControl it = t;
c.Paint();
t.Paint();
ic.Paint();
it.Paint(); //为什么调用Control类的Paint方法
}
}
interface IControl
{
void Paint();
}
class Control : IControl
{
public virtual void Paint() { Console.WriteLine("Control"); }
}
class TextBox : Control
{
override public void Paint() { Console.WriteLine("TextBox"); }
}class App
{
static void Main()
{
Control c = new Control();
TextBox t = new TextBox();
IControl ic = c;
IControl it = t;
c.Paint();
t.Paint();
ic.Paint();
it.Paint(); //为什么调用TextBox类中的Paint方法
}
}========================================================================
应该怎么进行分析呢
new 时, 有二个相同的Paint(), 接口才不管你是谁的,它顺序查找,有就执行
override 是对Paint的完全重写,所以方法表里只有一个Paint
{
new public void Paint() { Console.WriteLine("TextBox"); }
}
new 时, 有二个相同的Paint(), 接口才不管你是谁的,它顺序查找,有就执行
override 是对Paint的完全重写,所以方法表里只有一个Paint
-------------------------------------------------------------------
还是没明白,
IPain() // Control
IPain() // TextBox 第二个程序
IPain() //完全重写了, 所在方法列表里只有一个
{
void Paint();
}
class Control : IControl
{
public void Paint() { Console.WriteLine("Control"); }
}
class TextBox : Control
{
new public void Paint() { Console.WriteLine("TextBox"); }
} class App
{
static void Main()
{
Control c = new Control();
TextBox t = new TextBox();
IControl ic = c;
IControl it = t;
c.Paint();
t.Paint();
ic.Paint();
it.Paint();
//为什么调用Control类的Paint方法
//因为it指向一个new TextBox() 而在TextBox类中的paint方法是用new修饰符,简单的说就是没实现多态
}
}
{
void Paint();
}
class Control : IControl
{
public virtual void Paint() { Console.WriteLine("Control"); }
}
class TextBox : Control
{
override public void Paint() { Console.WriteLine("TextBox"); }
} class App
{
static void Main()
{
Control c = new Control();
TextBox t = new TextBox();
IControl ic = c;
IControl it = t;
c.Paint();
t.Paint();
ic.Paint();
it.Paint();
//为什么调用TextBox类中的Paint方法
//override代表对父类方法的重写,简单地说,实现了多态
}
}
override时,TextBox 对control类的Paint()方法进行了重写,所以就调用TextBox类中的Paint方法
{
void Paint();
}
class Control : IControl
{
public void Paint() { Console.WriteLine("Control"); }
}
class TextBox : Control
{
new public void Paint() { Console.WriteLine("TextBox"); }
} class myCtrl : TextBox
{
public void myPaint() { Console.WriteLine("myCtrl"); }
} class App
{
static void Main()
{
Control c = new Control();
TextBox t = new TextBox();
myCtrl my = new myCtrl();
IControl ic = (IControl)c;
IControl it = (IControl)t;
IControl imy = (IControl)my;
c.Paint();
t.Paint();
my.Paint(); //这里执行TextBox类的Paint()
ic.Paint();
it.Paint(); //为什么调用Control类的Paint方法
imy.Paint();
}
} 为说明问题,特加myCtrl类,它从TextBox类继承
我们看TextBox类的Paint()用new定义,它隐藏了Control类的Paint(),这样Control类的Paint()对TextBox类及继承于TextBox类的子类来说是不可见的,
或者说是不可用的.(从my.Paint()可知) 而TextBox类的Paint()对其父类来说也是不可见的.
注意ic,it,imy的类型定义为IControl,换句话说就是接口类型的对象变量,这里实际上是将子类转换成其父类类型,
那么对IControl来说,可见的只有Control类的Paint(), 仔细看加色部分,就会明白的