如何解决扩展类时C#OOP特定的参数
我有一个ClassA类,该类具有受保护的属性,类型为AttA类,一个ClassB类从ClassA扩展而来,而AttB类则从AttA扩展。
在ClassA类中,我想使用属性AttA,但在ClassB类中,我想使用更具体的属性AttB。
有办法吗?
class ClassA
{
protected AttA att;
public void MyMethod()
{
// using att as AttA
}
}
class ClassB : ClassA
{
public override void MyMethod()
{
// Want to use att as AttB (if possible without downcasting)
}
}
谢谢。
解决方法
一种简单的方法是使用new
关键字:
class ClassA
{
protected AttA att;
public virtual void MyMethod()
{
}
}
class ClassB : ClassA
{
new protected AttB att;
public override void MyMethod()
{
}
}
class AttA
{
}
class AttB : AttA
{
}
但这可能会在使用多态性时引起问题,因为编写:
var b = new ClassB();
//b.att is type of AttB here
var a = (ClassA)b;
//a.att is type of AttA here and it is not the same variable
实际上,有两个字段att
取决于您操作的类型,因此在类实现中要特别小心,尤其是从子类中调用基成员时。
由于该字段受到保护,因此此问题受到限制。
相反,这可能正是需要的。
https://docs.microsoft.com/dotnet/csharp/language-reference/keywords/new-modifier
我试图找到一个泛型解决方案,但是由于C#不支持真正的泛型多态性,并且我们不能为一个类类型的一个类型约束一个泛型类型参数,所以这是不可能的,据我所知-或者它需要使用反射来编写一些代码,除非有必要,否则可以在这里进行过度设计(因此,可以在类层次结构之间使用相同的变量来暴露所需的多态类型)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。