我需要嵌套泛型,如A< B<基数> >
当我这样做时,只暴露外部属性(A)。我无法弄清楚如何访问(B)的方法等。然后我尝试在内部访问接口,结果相同。
(编辑)为了澄清用例,我需要的解决方案应该使用 公共等级C:A< B<基数> >要么 公共等级C:B< A<基数> > 我不需要那些导致相同的类,但两个定义都有相应的方法。正如您可能怀疑的那样,我正在尝试使用它来跨多个对象以模块化模式实现通用功能。扩展方法让我接近,但他们不会允许覆盖行为,因为这个解决方案会(如果可以实现)。
我附上了测试代码,可能比我更清楚地显示问题。
using System;
using System.Reflection;
namespace ArchitecturalTestGround
{
public interface IBase
{
void BaseMethod1();
}
public interface IA : IBase
{
void AMethod();
}
public interface IB : IBase
{
void BMethod();
}
public class Base : IBase
{
public void BaseMethod1() { }
}
public class A<T> : IA where T : IBase
{
public void BaseMethod1() { }
public void AMethod() { }
}
public class B<T> : IB where T : IBase
{
public void BaseMethod1() { }
public void BMethod() { }
}
public class Test1 : A<B<Base>>
{
}
public class Test2 : B<A<Base>>
{
}
public class Program
{
public static void Main(string[] args)
{
Test1 e1 = new Test1();
Test2 e2 = new Test2();
Console.WriteLine("Test1 - A<B<Base>>");
foreach (MemberInfo mi in typeof(Test1).GetMembers())
{
Console.WriteLine($" {mi.Name}.{mi.MemberType}");
}
if (e1 is IB) { Console.WriteLine(" Supports IB"); }
if (e1 is IA) { Console.WriteLine(" Supports IA"); }
Console.WriteLine();
Console.WriteLine("Test2 - B<A<Base>>");
foreach (MemberInfo mi in typeof(Test2).GetMembers())
{
Console.WriteLine($" {mi.Name}.{mi.MemberType}");
}
if (e2 is IB) { Console.WriteLine(" Supports IB"); }
if (e2 is IA) { Console.WriteLine(" Supports IA"); }
Console.ReadKey();
}
}
}
答案 0 :(得分:0)
Test1
继承自A<T>
(无论T
是什么),而A<T>
是继承自IA
,IBase
继承自A<T>
因此,您只能看到该继承链中的方法:
来自public void BaseMethod1() { }
public void AMethod() { }
:
IA
来自void AMethod();
:
IBase
来自void BaseMethod1();
:
pd.to_csv('test.csv', quoting=csv.QUOTE_NONE)
(顺便提一下,从代码示例中注意,由于BaseMethod1,您可能会收到编译器警告)。
我想我知道你要去哪里。您可能遇到过需要从两个类继承的情况。 C#中无法进行多类继承。虽然有一些方法。
一般来说,如果您遇到这样的情况,那么更多次意味着您需要重新考虑您的设计。如果你仍然对这个问题感兴趣,请检查这个人:
答案 1 :(得分:0)
是否可以像这样更改您的定义?
public class A<T> : IA where T : IBase
{
T NestedGeneric;
public A(T nested)
{
NestedGeneric = nested;
}
public void BaseMethod1() { }
public void AMethod() { }
}
public class Test1 : A<B<Base>>
{
public B<Base> NestedGeneric;
public Test1(B<Base> nested) : base(nested)
{
NestedGeneric = nested;
}
}
这允许您执行e1.NestedGeneric.BMethod();
。