c# - "Hiding"子类中具有非泛型方法的泛型方法

标签 c# generics overriding

我已经编写了一些代码,我很好奇我正在做的事情是否存在我不知道的危险。

我尝试过搜索,我发现的大多数问题都与如何使事物通用化有关,这不是我的问题。我还查看了 13.4.3 节下的 .net 4.5 的 C# 规范 - 通用方法和 7.5.2 关于类型推断,最后是 7.5.2.12 推断返回类型,它们并没有真正涵盖我正在尝试做的事情.

基本上我有一个类的层次结构

public class SomeBaseClass { }
public class SomeClass : SomeBaseClass { }
public class AnotherClass : SomeBaseClass { }

public class BaseData
{
    public SomeBaseClass mMember;
    public BaseData() { }
    public TType GetMember<TType>()
        where TType : SomeBaseClass
    {
        return (TType)mMember;
    }
}

public class Data : BaseData
{
    public Data()
    {
        mMember = new SomeClass();
    }

    //Is this bad
    public SomeClass GetMember()
    {
        return base.GetMember<SomeClass>();
    }
}

编译器不会提示,因为我没有隐藏基类方法。这表明智能感知将它们列为两个单独的方法。我已经编写了几个测试,它们的行为都符合我的预期,并且在查看 List<> 之类的东西时,有一些方法实例同时具有通用和非通用实现(例如来自 ParallelEnumerable 的 AsParallel),但不同之处在于在这种情况下,两种方法都存在于同一个类中,并分别接受通用和非通用参数。

下面列出了我运行并按照我期望的方式运行的测试。

class Program
{
    static void Main(string[] args)
    {
        BaseData lData = new Data();
        Data lData2 = new Data();

        //Call base method with type
        SomeBaseClass lTest = lData.GetMember<SomeClass>();

        //Cast and call derived method
        SomeClass lTest2 = ((Data)lData).GetMember();

        //Call base method with type and then cast
        SomeClass lTest3 = (SomeClass)lData.GetMember<SomeBaseClass>();

        //Call derived method directly
        SomeClass lTest4 = lData2.GetMember();

        //Throw InvalidCastException
        SomeBaseClass lTest5 = lData2.GetMember<AnotherClass>();
    }
}

这样做的主要原因是我希望当类本身已经具有此信息时,任何调用者代码都不必知道泛型类型。这是为了避免必须写

lData.GetMemberType<...>();

无处不在。

如果这个问题过于宽泛或过于武断,我深表歉意。大多数情况下,我只是想知道在这种情况下是否有任何事情无法按照我的想法或隐藏的错误等方式工作。

最佳答案

你的问题有点过于模糊,无法给出很好的答案(你用这个做什么?这个设计的目的是什么?)。

我不认为名称重叠有什么问题,但它确实看起来像是设计有问题和泛型滥用的症状(所有转换应该让您了解这一点)。

理想情况下,您的类本身应该是泛型的,并且您应该始终使用泛型类型参数。这将使您免于正在进行的所有转换:

public class SomeBaseClass { }
public class SomeClass : SomeBaseClass { }
public class AnotherClass : SomeBaseClass { }

public class BaseData<TType> where TType : SomeBaseClass
{
    protected TType mMember;
    public BaseData() { }
    public BaseData(TType member)
        : this()
    {
        mMember = member;
    }

    public TType GetMember()
    {
        return mMember;
    }
}

public class Data : BaseData<SomeClass>
{
    public Data()
        : base(new SomeClass())
    {
    }

    // no need to implement GetMember(); base class has it covered
}

关于c# - "Hiding"子类中具有非泛型方法的泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29375405/

相关文章:

c# - 如何在 C# 中将二维数组打印到控制台

c# - 在哪里可以找到有关在真实项目中使用 Entity Framework 的良好分步教程?

swift - 使用通用函数从云记录(或其他外部源)填充对象

java - 设计帮助!枚举工厂变压器中的java泛型!

c# - 检查 T 是否实现接口(interface)并在填充接口(interface)属性后返回 T

java - 扩展父类(super class)和 ClassCastException

java - 实例方法重写与字段隐藏

c# - 如何在WFA中将数据添加到BoxPlot?

c# - 如何使用 C# 代码运行 C# 代码?

java - 方法被重写后,类不可序列化