问题如题
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());
}
}编译不能通过

解决方案 »

  1.   

    标题写错了一个字,怎样才能改为继承的方法,如何才能返回类型不一样,就如同DbConnection.CreateCommand 和 SqlConnection.CreateCommand
      

  2.   

    首先不谈别的,,你的测试代码有误。。
    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一样
    说白了就是,抽象的可以转换为具体的
      

  3.   

    不好意思,,就像Object对象可以转换为string一样
    说白了就是,抽象的可以转换为具体的 这里说错了应该是父类的对象可以通过子类来实例化,也就是父类对象可以引用子类对象
      

  4.   

    之前把你的意思理解错了。。下面就是你要的
        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();
            }
        }
      

  5.   

    谢谢你的热心回复,但是在你的代码中测试
    B bb=new BB();
    b.Bname();//这个方法返回的是B类的方法,而不是BB类的方法,没有实现多态。就如同 SqlConnection.CreateCommand()返回的结果成了 DbCommand
    依然不是我想要的结果。
      

  6.   

    终于弄明白了,例子如下,有更好的方法请回复告诉我。三天后结贴。 class A
    {
    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());
    }
    }