今天写了段代码,实现的是经典的长方形和正方形问题。这是长方形的代码

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; 
}
 

用字段来覆盖方法也行???!!!