问题如题
SqlConnection.CreateCommand 继承至 DbConnection.CreateCommand
但他们的返回类型不如,如何实现。自己测试 abstract class A
{
public abstract object name();
}
class B : A
{
public override object name()
{
return "B";
}
}
class C : A
{
public new string name()
{
return "C";
}
}
class Program
{
static void Main(string[] args)
{
A c=new C();
Console.WriteLine(c.name());
}
}编译不能通过
SqlConnection.CreateCommand 继承至 DbConnection.CreateCommand
但他们的返回类型不如,如何实现。自己测试 abstract class A
{
public abstract object name();
}
class B : A
{
public override object name()
{
return "B";
}
}
class C : A
{
public new string name()
{
return "C";
}
}
class Program
{
static void Main(string[] args)
{
A c=new C();
Console.WriteLine(c.name());
}
}编译不能通过
public new string name()new 会覆盖A类的name()方法,所以你虽然继承了A类,但是你没有重写A类的抽象方法。这里会报错
不信你把public new string name()改为public new object name()试试看。第二,继承基类的方法签名要一致。。string name() 一定要为object name()其实你的问题很好解决。。
SqlConnection.CreateCommand的返回类型试SqlCommand
DbConnection.CreateCommand 的返回类型试DbCommand
DbCommand是可以转换为SqlCommand对象的 比如强转 (SqlCommand)DbCommand就像Object对象可以转换为string一样
说白了就是,抽象的可以转换为具体的
说白了就是,抽象的可以转换为具体的 这里说错了应该是父类的对象可以通过子类来实例化,也就是父类对象可以引用子类对象
abstract class A
{ }
class AA : A
{ }
abstract class B
{
public A Bname()
{
A a=null;
return a;
}
} class BB : B
{
public new AA Bname()
{
AA aa=null;
return aa;
}
}
class Program
{
static void Main(string[] args)
{
Console.ReadKey();
}
}
B bb=new BB();
b.Bname();//这个方法返回的是B类的方法,而不是BB类的方法,没有实现多态。就如同 SqlConnection.CreateCommand()返回的结果成了 DbCommand
依然不是我想要的结果。
{
public object name()
{
return _name();
}
protected virtual object _name()
{
return "A";
}
}
class B : A
{
public new string name()
{
return _name().ToString();
}
protected override object _name()
{
return "B";
}
}
class Program
{
static void Main(string[] args)
{
A c=new B();
Console.WriteLine(c.name());
}
}