抽象类中的嵌套抽象类以及如何实现它

时间:2015-02-28 18:46:34

标签: c# abstract-class inner-classes abstraction

我有一个抽象类A和一个带有参数的抽象方法,该参数又是在同一个抽象类A中定义的抽象类B.当我将这个抽象类A扩展为另一个类C的一部分时,我如何实现该方法嵌套抽象类的参数。

public abstract class A<T, V>
{
    public abstract int GetObject(T t, V v);
    public abstract int GetAnotherObject(B b);
    public abstract class B{}
}

此类由另一个C类扩展

public class C: A<ABC, DEF>
{
        public C()
        {

        }
        public override int GetObject(ABC abc, DEF def)
        {
            return 10;
        }

        public override int GetAnotherObject(B b)
        {
            return 15;
        }
}

如何使用一些属性实现B类并传入GetAnotherObject方法。有人可以帮助我。

3 个答案:

答案 0 :(得分:4)

来自ECMA:

  

任何嵌套在泛型内的类   类声明或通用结构   声明(第25.2节)本身就是一个   泛型类声明,因为类型   包含类型的参数   应提供以创建一个   构造类型。

因此,如果不为B提供类型参数,则无法实现嵌套A

void Main()
{
    var c = new C();
    var result = c.GetAnotherObject(new BImpl<string, int>());
}

public class BImpl<T, V> : A<T, V>.B
{
    public override int BM()
    {
        return 1;
    }
}

// Or you can supply type arguments right here
//public class BImpl : A<string, int>.B
//{
//  public override int BM()
//  {
//      return 1;
//  }
//}

public abstract class A<T, V>
{
    public abstract int GetObject(T t, V v);
    public abstract int GetAnotherObject(B b);
    public abstract class B
    {
        public abstract int BM();
    }
}

public class C : A<string, int>
{
    public C()
    {

    }

    public override int GetObject(string abc, int def)
    {
        return 10;
    }

    public override int GetAnotherObject(B b)
    {
        return b.BM();
    }
}

答案 1 :(得分:2)

你已经非常接近了。

public class C<ABC, DEF> : A<ABC, DEF>
{
    public C()
    {

    }
    public override int GetObject(ABC abc, DEF def)
    {
        return 10;
    }

    // since B is a nested class of A, it has no scope outside of A
    // outside of the definition of A, it must always be referred to as A.B
    public override int GetAnotherObject(A<ABC,DEF>.B b)
    {
        return 15;
    }
}

public class D : A<ABC,DEF>.B
{
    // implementation of A.B
}

请注意,C 总是正好A.B。您永远无法定义A.B的实现(让我们称之为D)并且C的方法签名是指覆盖中的方法签名。在{A}中定义GetAnotherObjectA.B,因此必须实施{em>任何 A.B,而不是A.B的某些具体实现。< / p>

RE:您对如何在A.B

中实施C的评论

A.B内实施C没有意义。 C仍需要在其方法签名中包含A.B。但如果你真的必须,出于某种原因。

public class C<ABC, DEF> : A<ABC, DEF> 
{
    // C's implementation of A

    public override int GetAnotherObject(A<ABC,DEF>.B b)
    {
        return 15;
    }

    public class D : A<ABC,DEF>.B
    {
        // implementation of A.B
    }
}

请注意,GetAnotherObject仍然需要A.B,而不是D

答案 2 :(得分:0)

怎么样

public class C<ABC, DEF> : A<ABC, DEF>
{
    public C()
    {

    }
    public override int GetObject(ABC abc, DEF def)
    {
        return 10;
    }

    public override int GetAnotherObject(B b)
    {
        return 15;
    }
}

只需使用泛型对类进行后缀。