扩展用作属性的嵌套类

时间:2011-07-16 10:26:31

标签: c# inheritance interface properties nested-class

我写了一个嵌套类,用作属性的包。此类用作我命名为Properties的属性。我想通过接口扩展属性数量。

我写了这个例子:

public interface IFirst {
    int asd { get; set; }
}

public interface ISecond {
    int zxc { get; set; }
}

public class MyClass {
    public class PropertyClass : IFirst {
        public int asd {
            get {
                throw new NotImplementedException();
            }
            set {
                throw new NotImplementedException();
            }
        }
    }

    public PropertyClass Properties; 
}

public class MyNextClass : MyClass {
    public class PropertyClass : MyClass.PropertyClass, ISecond {
        public int zxc {
            get {
                throw new NotImplementedException();
            }
            set {
                throw new NotImplementedException();
            }
        }
    }

    public void test() {
        Properties.zxc = 5; // Here is problem
    }
}

但在这种情况下,我无法读/写新属性zxc

我认为,因为这仍然是从父类 - Properties而不是MyClass.PropertyClass读取MyNextClass.PropertyClass类型。

我想在不创建新属性或隐藏现有属性的情况下扩展它。

你有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您必须确保父类实现两个接口,或者您必须在子类中创建一个嵌套子类型的新静态成员。正如您所推测的那样,Properties被声明为父嵌套类型,并且声明从父嵌套类型派生的同名子类中的新类型不会改变它。

答案 1 :(得分:1)

那么,取决于你想要达到的目标,方法可能会有所不同。例如,使用抽象类可能会满足您的需求。像这样:

public interface IFirst
{
    int asd { get; set; }
}

public interface ISecond
{
    int zxc { get; set; }
}

public abstract class MyAbstractClass<T> where T : class
{
    public abstract T Properties {get; set;}
}

public class MyClass : MyAbstractClass<MyClass.PropertyClass>
{
    public class PropertyClass : IFirst
    {
        public int asd
        {
            get { throw new NotImplementedException(); }
            set { throw new NotImplementedException(); }
        }
    }

    public override MyClass.PropertyClass Properties
    {
        get { throw new NotImplementedException(); }
        set { throw new NotImplementedException(); }
    }
}

public class MyNextClass : MyAbstractClass<MyNextClass.PropertyClass>
{
    public class PropertyClass : MyClass.PropertyClass, ISecond
    {
        public int zxc
        {
            get { throw new NotImplementedException(); }
            set { throw new NotImplementedException(); }
        }
    }

    public override MyNextClass.PropertyClass Properties
    {
        get { throw new NotImplementedException(); }
        set { throw new NotImplementedException(); }
    }

    public void test()
    {
        Properties.zxc = 5;
    }
}