说我有一个像......这样的课程。
public abstract class Base
{
public abstract IAttributes Attributes{ get; set; }
}
public interface IAttributes
{
string GlobalId { get; set; }
}
这样的课......
public class ImplementAttributes : IAttributes
{
public string GlobalId { get; set; } = "";
public string LocalId { get; set; } = "";
// Other Properties and Methods....
}
然后我像......那样实现它。
public class Derived: Base
{
public new ImplementAttributes Attributes { get; set; }
}
现在,我意识到上述操作不起作用,因为我无法覆盖属性属性,如果我用 new 隐藏它,那么下面的bellow为null因为 Base 属性没有被写入。
public void DoSomethingWithAttributes(Base base)
{
var Foo = FindFoo(base.Attributes.GlobalId); // Null because its hidden
}
但我希望能够最终像上面一样访问 Base 和 Derived 属性。
这可以实现吗?还有更好的方法吗?
答案 0 :(得分:2)
您可以使用泛型:
String s = "abc def (<a href = \"https://www.example.com\">terms and conditions apply</a>)";
String a = s.replaceAll("<a(.*?)>|</a>", "");
和
public abstract class Base<T> where T: IAttributes
{
public abstract T Attributes{ get; set; }
}
public interface IAttributes
{
string GlobalId { get; set; }
}
然后:
public class Derived: Base<ImplementAttributes>
{
public override ImplementAttributes Attributes { get; set; }
}
您可以传递public void DoSomethingWithAttributes<T>(Base<T> b) where T : IAttributes
{
var Foo = FindFoo(b.Attributes.GlobalId);
}
个实例,而无需明确指定类型参数:
Derived