【问题标题】:C# - Override <T> method signature with ClassName?C# - 用 ClassName 覆盖 <T> 方法签名?
【发布时间】:2010-08-02 14:35:56
【问题描述】:

有没有办法覆盖抽象类的方法签名,它使用 &lt;T&gt; 和 ClassName,这样我就可以通过引用传递对象而无需重铸它?

例如,我有一堆对象管理器。我希望它们都包含一个 .Save(Object) 方法,该方法将根据对象状态(插入、更新、删除等)执行适当的保存操作。

我试图创建一个包含这些方法的基类:

protected virtual bool Update<T>(ref T _object) where T : ObjectBase
{
    throw new NotImplementedException();
}

public virtual bool Save<T>(ref T _object) where T : ObjectBase
{ 
    // Figure out which action to take based on _object's state and execute it
}

我希望我的继承类使用类似这样的方法来定义方法:

public override bool Update<Consumer>(ref Consumer _object)
{
    return _service.UpdateConsumer(ref _object);
}

我的问题是我无法指定 &lt;T&gt; 现在将是 &lt;Consumer&gt;,并且将其保留在 &lt;T&gt; 我无法通过 ref 传递它

【问题讨论】:

  • 为什么需要指定ref?无论如何,它几乎可以肯定是一个参考对象。见仁见智,但我会说 ref 是不好的形式。
  • 这不是 ref 的意思... ref 表示正在传递实际的引用。因此,如果他将 _object 的值更改为不同的对象,它将反映在 _object 的调用者引用中。但在这种情况下,我看不出他这样做的任何理由。
  • 我是通过引用传递的,因为 _service 是 WCF 服务,它会根据数据库输入/输出更改对象属性。
  • @Brian Right;目的似乎是确保调用者的引用由该方法更新,当传递一个值对象时会这样做(也是一个有效的,如果不漂亮,使用ref)。
  • 是的,当我在 WCF 服务器上更新它时,我想确保调用者对变量的引用已更新。我并没有真正使用 ref 太多,我唯一一次是在一个用 VB 完成的项目中。如果您知道更好的方法,请告诉我:)

标签: overriding type-conversion method-signature


【解决方案1】:

您应该使整个基类通用,而不是使方法本身通用。

例如:

public abstract class ObjectManager<T> where T : ObjectBase {
    protected abstract bool Update(T obj);
}

每个具体的 ObjectManager 都应该继承它所管理的类型的 ObjectManager,如下所示:

public class ConsumerManager : ObjectManager<Consumer> {
    protected override bool Update(Consumer obj) {
        ...
    }
}

请注意,顺便说一句,您的参数几乎绝对不应传递ref
如果你想改变调用者的变量来引用一个不同的实例,你只需要ref关键字。
如需更多信息,请参阅here

【讨论】:

  • 什么意思?两组代码位于不同的类中,派生类继承自基类。我只是排除了类定义,因为我试图简化代码。
  • 谢谢,我不知道我能做到。
  • @Rachel 他的意思是,如果你把&lt;T&gt;放在类上,而不是方法上,那么你在派生类中的所有方法都会使用你想要的类型。基类中的public abstract void UpdateThing(T thing) 将变为派生类中的public void UpdateThing(Consumer thing)
猜你喜欢
  • 2017-02-16
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
  • 2010-11-16
  • 1970-01-01
相关资源
最近更新 更多