覆盖抽象接口属性

时间:2017-10-06 16:49:37

标签: c#

说我有一个像......这样的课程。

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 属性。

这可以实现吗?还有更好的方法吗?

1 个答案:

答案 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