覆盖继承字段的属性

时间:2018-04-28 13:33:26

标签: c#

假设我有一个班级:

abstract class MyBaseClass {

   [Attribute1]
   [Attribute2]
   public string Property1 {get; set; }

   [Attribute3]
   [Attribute4]
   public string Property2 {get; set; }
}

在子类中,扩展了这个类,我想在Property1Property2中添加新属性,保留在父类中声明的属性。

这可能吗?

3 个答案:

答案 0 :(得分:2)

Two Second=new SecondFragment();  // it will be called on click of firstFragment which pass the value.
Second.two("Value one","Value two");

interface Two{
void two(String value,String value);   // implement this inteface in SecondFragment and call it in FirstFragment
}

确保属性1-4使用inherited = true

abstract class MyBaseClass {

   [Attribute1]
   [Attribute2]
   public virtual string Property1 {get; set; }

   [Attribute3]
   [Attribute4]
   public virtual string Property2 {get; set; }
}

class NewClass:MyBaseClass
{
  [Attribute5]
  public override string Property1 {get;set;}

  [Attribute6]
  public override string Property2 {get;set;}
}

答案 1 :(得分:1)

是的,您可以覆盖Property1Property2。你显然需要在基类中使它们虚拟化:

class MyAttribute: Attribute {}
class YourAttribute: Attribute {}

class Base
{
    [My]
    public virtual void Foo() {}
}

class Derived: Base 
{
    [Your]
    public override void Foo()
    {
    }
}

现在var attributes = typeof(Derived).GetMethod("Foo").GetCustomAttributes();将返回MyAttribute的{​​{1}}和YourAttribute个实例。

请注意,所有Derived.Foo类型方法都有一个重载,允许您指定是否要将继承的属性包含在结果中。默认行为是包含继承的属性。

答案 2 :(得分:0)

只有在未使用AttributeUsageAttribute.Inherited = false指定要继承的属性时才可能。例如,加入ObsoleteAttribute不起作用:

abstract class MyBaseClass {

   [Obsolete]
   public virtual string Property1 {get; set; }

}

class Derived : MyBaseClass
{
    public override string Property1 {get; set;}
}

在此示例中,您会收到警告消息:

  

会员' Property1'覆盖过时的成员' Property1'。添加   属于' Property1'

的过时属性

默认情况下,使用Inherit = True标志设置属性。因此,如果您创建自定义属性,继承应该可以正常工作。