今天写了段代码,实现的是经典的长方形和正方形问题。这是长方形的代码
public class Rectangle
{
private long width;
private long height;
public long Width
{
set
{
width=value;
}
get
{
return width;
}
}
public long Height
{
set
{
height=value;
}
get
{
return height;
}
}
}然后我做一个正方形类,继承长方形类(这种做法显然是不符合里氏替换原则的),并在代码中强制设置长和宽相等,代码如下:
public class Square :Rectangle
{
private long side;
new public long Width
{
get
{
return side;
}
set
{
side=value;
}
}
new public long Height
{
get
{
return side;
}
set
{
side=value;
}
}
}这样代码是没什么问题的,但是我们把代码稍做改动问题就会出现,我们把属性写成方法的形式
public class Square :Rectangle
{
private long side;
new public long Width()
{
//get
//{
return side;
//}
//set
//{
// side=value;
//}
}
new public long Height()
{
//get
//{
return side;
//}
//set
//{
// side=value;
//}
}
}这是Microsoft Visual Studio .NET 2003的类视图,可以清楚地看到属性继承后用方法进行了替代。
天哪,这样的代码居然可以编译通过,谁能解释这一现象。
更让我吃惊的是以下的代码也可以编译通过
public class A
{
public string Hello()
{
return ("Hello A");
}
} 

public class B:A
{
new public string Hello;
} 用字段来覆盖方法也行???!!!


浙公网安备 33010602011771号