gpt4 book ai didi

c# - 类设计 - 具有通用后代的基类

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

我有以下类(class)

  class GridBase
{
public object DataSource { get; set; }
}

class GenericGrid<T> : GridBase
{
public new T DataSource { get; set; }
}

GridBase 和 Generic Grid 类都可以实例化,也可以从其中任何一个派生。

这是否被认为是实现这种层次结构的正确/可接受的方式?或者你应该加倍努力并像下面这样实现它

  class GridBase
{
protected object dataSource;
public object DataSource { get { return dataSource; } set { dataSource = value; } }
}

class GenericGrid<T> : GridBase
{
public new T DataSource { get { return (T)dataSource; } set { dataSource = value; } }
}

当在后代中重新引入属性时,这同样适用于非泛型类,我在这里仅使用一个泛型示例。

另一个案例和问题

  abstract class SomeBase
{
protected abstract void DoSomething();
}

class Child : SomeBase
{
protected override void DoSomething()
{
/* Some implementation here */
}
}

这里的情况是框架“X”声明了 SomeBase 允许您定义自己的后代。他们创建的类(在运行时)然后继承自您的类(在本例中为 Child)。但是,他们不会从 DoSomething() 的实现中调用您的 DoSomething() 方法。

就他们而言,他们也不能盲目地调用 base.Dosomething(),因为典型情况是他们生成的类通常是从 SomeBase 派生的,并且由于该方法是抽象的,因此无效。 (就个人而言,我不喜欢 C# 中的这种行为)。

但无论如何,不​​调用 base.xxx() 的设计是好的还是公认的,尤其是当“意图”似乎自相矛盾时?

编辑 从框架设计的角度来看。它这样做可以/可以接受吗?如果不是,它将如何设计以防止这种情况或更好地传达他们的意图(在这两种情况下)。

最佳答案

我更喜欢这样的东西:

interface IGrid {
object DataSource { get; }
}

interface IGrid<T> {
T DataSource { get; }
}

public Grid : IGrid {
public object DataSource { get; private set; }

// details elided
}

public Grid<T> : IGrid<T> {
public T DataSource { get; private set; }
object IGrid.DataSource { get { return this.DataSource; } }

// details elided
}

请注意,我不是从 Grid 继承的。

关于c# - 类设计 - 具有通用后代的基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4250144/

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