返回一个更具体的类型是隐藏基类属性的一个好用例吗?

时间:2015-06-25 09:15:46

标签: c#

在我正在维护的项目中,我们有一个核心基类,它具有一种上下文对象的属性:

public abstract class Base
{
  public BaseContext Context { get; protected set; }
}

通常如果派生Base,也需要派生BaseContext,并且通常需要派生类中更具体的上下文。因此我认为以下内容可能非常好:

public class Derived : Base
{
  public new DerivedContext Context
  {
    get { return (DerivedContext) base.Context; }
    protected set { base.Context = value; }
  }
}

从类型安全的角度来看,除了演员之外,这应该都很好,但是,不应该失败,因为类只能设置属性本身。使用这个会在代码中剪切一些强制转换,在少数情况下我会((DerivedContext) Context).Foo,我实际上需要派生上下文的属性/方法。

是否有任何反对这种阴影的红旗?

(再考虑一下,可能还有另一种方法,使用泛型来实现同样的目标:

public abstract class Base<TContext> where TContext : BaseContext
{
  public TContext Context { get; protected set; }
}

public class Derived : Base<DerivedContext> {}

并不需要隐藏基本成员。也许整体可能更清洁。)

1 个答案:

答案 0 :(得分:4)

阴影通常是一个坏主意。而且这里看起来似乎没有必要 - 为什么不使用泛型类呢?

public abstract class Base<T>
{
  public T Context { get; protected set; }
}

public class Derived : Base<DerivedContext>
{
  ...
}

没有投射,没有阴影,都是强类型的。