Расширение вложенного класса, который используется как свойство - PullRequest
0 голосов
/ 16 июля 2011

Я написал вложенный класс, который используется в качестве пакета для свойств.Этот класс используется как свойство, которое я назвал 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 ]

1 голос
/ 16 июля 2011

Ну, в зависимости от того, что вы пытаетесь достичь, подходы могут отличаться.Например, использование абстрактного класса может удовлетворить ваши потребности.Как это:

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;
    }
}
1 голос
/ 16 июля 2011

Вам нужно будет либо убедиться, что родительский класс реализует оба интерфейса, либо вам придется создать новый статический член в дочернем классе, который имеет вложенный дочерний тип. Как вы предполагаете, Properties объявляется как вложенный родительский тип, и объявление нового типа в дочернем классе с тем же именем, которое происходит от родительского вложенного типа, не меняет этого.

...