gpt4 book ai didi

c# - 使用不同的兼容类型覆盖属性

转载 作者:IT王子 更新时间:2023-10-29 04:47:46 28 4
gpt4 key购买 nike

我需要一个带有属性的基类,我可以在其中派生具有相同属性但不同(兼容)类型的类。基类可以是抽象的。

public class Base
{
public virtual object prop { get; set; }
}

public class StrBase : Base
{
public override string prop { get; set; } // compiler error
}

public class UseIt
{
public void use()
{
List<Base> l = new List<Base>();
//...
}
}

我尝试使用泛型,但在使用该类时出现问题,因为我想在列表中存储不同类型的基类。

public class BaseG<T>
{
public T prop { get; set; }
}

public class UseIt
{
public void use()
{
List<BaseG> l = new List<BaseG>(); // requires type argument
//...
}
}

最佳答案

这是建议解决方案的替代方法:

public abstract class Base
{
public abstract void Use();
public abstract object GetProp();
}

public abstract class GenericBase<T> : Base
{
public T Prop { get; set; }

public override object GetProp()
{
return Prop;
}
}

public class StrBase : GenericBase<string>
{
public override void Use()
{
Console.WriteLine("Using string: {0}", Prop);
}
}

public class IntBase : GenericBase<int>
{
public override void Use()
{
Console.WriteLine("Using int: {0}", Prop);
}
}

基本上,我在中间添加了一个通用类,用于存储您正确键入的属性。假设您永远不需要访问 Prop,这将起作用来自迭代 List<Base> 成员的代码. (如果需要,您始终可以向 Base 添加一个名为 GetProp 的抽象方法,将泛型转换为对象。)

示例用法:

class Program
{
static void Main(string[] args)
{
List<Base> l = new List<Base>();

l.Add(new StrBase {Prop = "foo"});
l.Add(new IntBase {Prop = 42});

Console.WriteLine("Using each item");
foreach (var o in l)
{
o.Use();
}
Console.WriteLine("Done");
Console.ReadKey();
}
}

编辑:添加了 GetProp() 方法来说明如何从基类直接访问属性。

关于c# - 使用不同的兼容类型覆盖属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3141325/

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