今天做这个实践是为了测试类继承和实现接口各个方法调用情况。
基类BaseA代码
public class BaseA
{
//我是基类方法
public void SaveDataCommon()
{
Console.WriteLine("我是基类BaseA方法SaveDataCommon");
}
public void TestDataBaseA()
{
Console.WriteLine("我是基类独立的新方法TestDataBaseA");
}
}
接口 IBaseA代码
public interface IBaseA
{
/// <summary>
/// 接口方法一
/// </summary>
void SaveDataCommon();
/// <summary>
/// 接口方法二
/// </summary>
void OtherRunIBaseA();
}
}
基类BaseA和接口IBaseA有一个同名方法SaveDataCommon(),我们要测试到底是调用哪个? 接口 IBaseB代码
public interface IBaseB
{
void OpenDataIBaseB();
}
测试类 TestClass 代码
public class TestClass : BaseA, IBaseA, IBaseB
{
public void OpenDataIBaseB()
{
Console.WriteLine("我实现了B接口的方法OpenDataIBaseB");
}
public void OtherRunIBaseA()
{
Console.WriteLine("我实现了A接口的方法OtherRunIBaseA");
}
//public new void SaveDataCommon()
//{
// Console.WriteLine("隐藏了接口和基类方法");
//}
public void MySelfOpen()
{
Console.WriteLine("我自己独立的方法MySelfOpen");
}
}
测试代码
Console.WriteLine("TestClass可以使用全部方法");
TestClass testClass = new TestClass();
testClass.OtherRunIBaseA();
testClass.SaveDataCommon();
testClass.TestDataBaseA();
testClass.OpenDataIBaseB();
testClass.MySelfOpen();
Console.WriteLine("===================");
Console.WriteLine("IBaseB只能使用实现自己的方法");
IBaseB ib = new TestClass();
ib.OpenDataIBaseB();
//ib.SaveDataCommon(); 不行的
//ib.MySelfOpen(); 不行的
// ib.TestDataBaseA(); 不行的
Console.WriteLine("===================");
Console.WriteLine("IBaseA只能使用实现自己的方法");
IBaseA ia = new TestClass();
ia.SaveDataCommon();//类没有实现,调用的是基类方法
ia.OtherRunIBaseA();
// ia.MySelfOpen();不行的
// ia.TestDataBaseA(); 不行的
Console.WriteLine("===================");
Console.WriteLine("BaseA只能使用继承自己的方法");
BaseA baseA = new TestClass();
baseA.TestDataBaseA();
baseA.SaveDataCommon();
// baseA.MySelfOpen();不行的
// baseA.OtherRunIBaseA(); 不行的
//ib.OpenDataIBaseB();不行的
测试结果图
结论是:
使用TestClass接受实例化 可以使用接口和基类所有方法。 如果使用IBaseB接受实例化,只能使用接口IBaseB对应的方法 如果使用IBaseA接受实例化,只能使用IBaseA对应的方法,如果和基类方法相同,则使用的是基类方法 如果使用BaseA 接受实例化,只能使用基类BaseA对应的方法
如果要把基类方法和接口方法隐藏,就必须在方法前面加new 代码
public new void SaveDataCommon()
{
Console.WriteLine("隐藏了接口和基类方法,这是我重新的方法SaveDataCommon");
}
运行结果图
结论
类接受实例化,和接口接受实例化都是重写后的方法。 基类接受实例化还是调用原来基类的方法。