gpt4 book ai didi

c# - 使用成员隐藏 (`new` ) 来获取更具体的返回类型

转载 作者:行者123 更新时间:2023-11-30 15:47:47 24 4
gpt4 key购买 nike

我正在考虑使用 new 重新定义子类中的成员,以提供更具体的返回类型。问题是:这是个好主意,还是自找麻烦?

要解决的问题是存在多个“镜像”类层次结构时,其中每个层次结构层的类型都引用另一个层次结构的同一级别。很难解释,所以这里有一个例子:

class A1 {}
class A2 : A1 {}
class A3 : A2 {}

abstract class B1
{
protected A1 myA;

A1 MyA { get { return myA; } }
}

abstract class B2 : B1
{
new A2 MyA { get { return (A2)myA; } }
}

class B3 : B2
{
new A3 MyA
{
get { return (A3)myA; }
set { myA = value; }
}
}

有些代码只处理抽象“级别”1(A1/B1 等),就像其他所有级别一样。如果每个“级别”都能看到尽可能具体的类型,那就太好了。目前,我在最顶层定义了类型,并一直在调用代码中向下转换它。有时我使用另一个名称为某个“级别”添加另一个成员,这会导致更多冗余成员。我想让它更干净。

(泛型在这里不是一个选项,因为 B2 在不知道 B3 的情况下不会有用(它需要额外的接口(interface))。如果有很多类型(例如,还有 C1/2/3、D1/2/3 ...)通用参数太多。从技术上讲它会起作用,但它会变得非常复杂。)

此外,我将序列化其中一些类 (DataContractSerializer),一些将使用 NHibernate 映射到数据库。

有没有人做过这样的事情?值得推荐吗?是否有其他方法可以解决同类问题?

编辑:由于讨论了关于强制转换和属性实现的问题,我稍微更改了代码。这实际上不是这里的问题。我只是试着写尽可能少的代码来做一个简短的例子。

最佳答案

我认为你在倒退......向下转型会失败,你应该用向上转型来设计它。 IEnumerable 的实现是这种模式最常见的例子。

派生程度最高的类型需要负责创建派生程度最高的结果,然后可以覆盖基类型中的虚方法以通过向上转换(可能是隐式的)返回派生程度最高的结果。

关于c# - 使用成员隐藏 (`new` ) 来获取更具体的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3201912/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com