提问人:HappyBullying 提问时间:4/25/2021 更新时间:4/25/2021 访问量:148
如何使用 C 中的扩展方法处理包含受保护成员的数据#
How to process data including protected members using extension method in C#
问:
最近,我需要使用子类的方法处理基类中包含的私有数据。我的基类只能包含特定于域的类型(它只表示数据)。因此,首先我决定在另一个项目中创建一个子类,并在其中实现处理逻辑。但问题是,一旦创建了基类的实例,就无法将其强制转换为子类型:
public class A
{
protected int member1;
public A(int value)
{
member1 = value;
}
}
public class B : A
{
public B (int value) : base(value)
{ }
public void DoSomething()
{
Console.Write(member1 * member1);
}
}
class Program
{
static void Main(string[] args)
{
A obj1 = new A(5);
B obj2 = (B)obj1; // InvalidCastException
obj2.DoSomething();
}
}
于是我开始思考推广方法。但是,您不能只从它们访问类的受保护字段。最后,我尝试将这两种方法结合起来。
答:
0赞
HappyBullying
4/25/2021
#1
这是我的解决方案:
- 确保允许您向基类添加新方法,并且您的类未被密封。
- 添加受保护的静态方法,该方法返回所需的受保护成员。
- 为基类创建 Extension 类。
- 在扩展类中,创建一个私有嵌套类。
- 从基类继承嵌套类。
- 在嵌套类中创建静态方法,并在中实现处理逻辑(可以从基类调用静态保护方法,从基类中获取受保护的成员)。
- 在扩展类中创建扩展方法,并在其中调用嵌套类的静态方法。
示例代码如下图所示:
public class A
{
protected int member1 = 0;
public A() {}
public A(int value)
{
member1 = value;
}
protected static int GetProtectedMember(A objA)
{
return objA.member1;
}
}
public static class AExtensions
{
public static void DoSomething(this A objA)
{
B.DoSomething(objA);
}
private class B : A
{
public static void DoSomething(A objA)
{
// objA.member1 // it's not allowed
int protectedFromA = A.GetProtectedMember(objA);
int sqr = protectedFromA * protectedFromA;
Console.WriteLine(sqr);
}
}
}
class Program
{
static void Main(string[] args)
{
A obj1 = new A(5);
obj1.DoSomething(); // 25
}
}
这样,您可以将表示数据的类保留在单独的项目中,并在不同的项目中实现处理此数据的多个实现。
评论
0赞
Devon Bessemer
4/25/2021
如果您有权向 A 添加方法,为什么所有其他方法都有效?似乎您不必要地扩展了类 A,而不仅仅是使用 A 的实例作为输入。
0赞
HappyBullying
4/25/2021
因为我想保护班级成员
0赞
HappyBullying
4/25/2021
所有这些都是为了将数据和可能的数据处理实现分开,因为每个可能的实现都可以有自己的依赖关系。
0赞
Devon Bessemer
4/25/2021
但是,您有目的地为子类添加新的受保护方法,因此您现在正在创建一个了解 B 的 A 实现。这对我来说似乎不是正确的方法。如果您需要访问 member1 的值,只需创建一个公共 getter。似乎您正在做额外的工作只是为了让它受到任意保护。
0赞
HappyBullying
4/25/2021
如果我创建一个公共 getter,每个人都可以看到受保护字段的值。
评论