C#覆盖泛型类中的基类属性

谢尔盖·阿尼西莫夫(Sergey Anisimov)

我对C#中的通用类和继承有疑问。也许我在某个地方错了,并且这样的代码设计没有遵循最佳实践,但我真的希望能使它起作用。我具有以下类结构:

public class BaseInfo
{
    public int Id { get; set; }
}

public class BaseData
{
}

public class SomeClass
{
    public BaseData Data { get; protected set; }
    public BaseInfo Info { get; protected set; }
}

public class SomeClass<TData, TInfo> : SomeClass
    where TData : BaseData, new()
    where TInfo : BaseInfo, new()
{
    public new TData Data { get; protected set; }
    public new TInfo Info { get; protected set; }

    public SomeClass()
    {
        Data = new TData();
        Info = new TInfo();
    }
}

然后我指定了一个特定的类:

public class SpecificInfo : BaseInfo
{
    public int MaxNumber { get; set; }
}

public class SpecificData : BaseData
{
    public int StartFrom { get; set; }
}

public class SpecificClass : SomeClass<SpecificData, SpecificInfo>
{
    public SpecificClass(int startFrom, int maxNumber)
    {
        Data = new SpecificData
        {
            StartFrom = startFrom
        };

        Info = new SpecificInfo
        {
            Id = 1,
            MaxNumber = maxNumber
        };
    }
}

然后,我想在程序中使用它:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello World!");

        var specific = new SpecificClass(100, 1000);

        Process(specific);
    }

    static void Process(SomeClass someClass)
    {
        var data = someClass.Data;

        if (data is SpecificData specificData)
        {
            Console.WriteLine($"This is specific data {specificData.StartFrom}");
        }
        else
        {
            Console.WriteLine("This is not specific data, sorry");
        }
    }
}

但是它表明数据不是SpecificData我猜这是行不通的,因为SomeClass.Data添加了new关键字,所以对象中有两个Data属性specific是否可以重写此代码以将非通用类Process(SomeClass someClass)保存方法的参数,并通过一些修改保存其余的类结构,但使其可行?也许我可以DataProcess方法内部找到所需谢谢!

广州7

通过使用接口而不是基类,并使用显式接口实现来实现接口的属性,可以解决此问题:

public interface ISomeClass
{
    BaseData Data { get; }
    BaseInfo Info { get; }
}

public class SomeClass<TData, TInfo> : ISomeClass
    where TData : BaseData, new()
    where TInfo : BaseInfo, new()
{
    public TData Data { get; protected set; }
    BaseData ISomeClass.Data => Data;
        
    public TInfo Info { get; protected set; }
    BaseInfo ISomeClass.Info => Info;

    public SomeClass()
    {
        Data = new TData();
        Info = new TInfo();
    }
}

如果您使用的是C#9,则还可以使用返回类型的协方差:

public abstract class BaseClass
{
    public abstract BaseData Data { get; }
    public abstract BaseInfo Info { get; }
}

public class SomeClass<TData, TInfo> : BaseClass
    where TData : BaseData, new()
    where TInfo : BaseInfo, new()
{
    public override TData Data { get; }
    public override TInfo Info { get; }

    public SomeClass()
    {
        Data = new TData();
        Info = new TInfo();
    }
}

请注意,我必须将属性设置SomeClass为仅getter,因为基本属性必须为仅getter,并且您不能set在覆盖中添加访问器。

如果确实需要在构造函数之外设置此属性,则可以执行以下操作:

public class SomeClass<TData, TInfo> : BaseClass
    where TData : BaseData, new()
    where TInfo : BaseInfo, new()
{
    protected TData MutableData { get; set; }
    public override TData Data => MutableData;
    
    protected TInfo MutableInfo { get; set; }
    public override TInfo Info => MutableInfo;

    public SomeClass()
    {
        MutableData = new TData();
        MutableInfo = new TInfo();
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我如何通过 C# 访问泛型类中的动态类属性?

来自分类Dev

如何设置泛型类的基类属性

来自分类Dev

如何在C#中遍历泛型类的属性?

来自分类Dev

覆盖 C# 中基类的属性值

来自分类Dev

获取作为基类传递给泛型方法的派生C#类的属性

来自分类Dev

当基类在C#中是泛型时,如何将子类转换为基类

来自分类Dev

在C#中的基类中使用泛型:如何确保基类中的方法返回派生类的类型?

来自分类Dev

C#泛型,基类和EventArgs,MVP,DI

来自分类Dev

具有基类和泛型键字段的泛型C / C#

来自分类Dev

避免使用泛型方法设置类属性的递归性C#

来自分类Dev

自动实现的属性类的C#泛型

来自分类Dev

如何在C#中找到泛型类的属性?

来自分类Dev

c# 泛型类的模式匹配属性?

来自分类Dev

如何在C#中的泛型类中使用泛型类的对象?

来自分类Dev

覆盖基类属性的读写

来自分类Dev

在C#中的函数中访问泛型类型的属性

来自分类Dev

C ++中的泛型类

来自分类Dev

C#中的多类泛型集合

来自分类Dev

C#在方法调用中扩展泛型类

来自分类Dev

在C#中创建泛型类的字典的辅助方法

来自分类Dev

在C#中实例化泛型类

来自分类Dev

C#在方法调用中扩展泛型类

来自分类Dev

C#中的多类泛型集合

来自分类Dev

将引用转换为C#中的泛型类

来自分类Dev

嵌套泛型/抽象类C#中的嵌套泛型的继承

来自分类Dev

c#中具有泛型类的泛型方法

来自分类Dev

c#获取泛型类中泛型类型参数的名称

来自分类Dev

在不获取泛型类型实例的泛型方法中读取具体的类属性

来自分类Dev

在C#中检查T泛型类型具有属性S(泛型)

Related 相关文章

热门标签

归档