2016-09-21 1 views
0

Пока я не пытался это сделать, я предположил, что знаю, как это работает; однако следующий код генерирует исключение. Поскольку TestOC является потомком ObservableCollection, я думал, что я мог бы сделать это:Использование дисперсии для преобразования родительского класса (ObservableCollection) в ребенка

class MyClass 
{ 
    public string MyProperty { get; set; } 
} 

class TestOC : ObservableCollection<MyClass> 
{ 

} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     ObservableCollection<MyClass> test = new ObservableCollection<MyClass>(); 
     test.Add(new MyClass()); 

     TestOC test2 = (TestOC)test; 
    } 
} 

Ошибка выброшен является:

Невозможно привести объект типа «System.Collections.ObjectModel.ObservableCollection`1 [ ConsoleApplication17.MyClass] 'для ввода' ConsoleApplication17.TestOC '.

Как я могу получить ObservableCollection, чтобы назначить мой класс для детей здесь?

+0

Почему вы хотите включить родительский класс в его подкласс? –

+0

Довольно много дубликатов: http://stackoverflow.com/questions/16534253/c-sharp-converting-base-class-to-child-class –

+2

Вы не можете использовать произвольное 'Animal' для' Dog' , Вы можете создать _new_ 'Dog' с теми же свойствами, что и« Animal », но вы не можете их отличить. –

ответ

2

Вы не можете наложить ObservableCollection<MyClass> на номер TestOC.

Потому что оно получено. Значение TestOC extends ObservableCollection<MyClass>. Поэтому, если вы хотите наложить ObservableCollection<MyClass> на TestOC, у него отсутствуют функции, добавленные TestOC. (даже если подкласс не имеет ничего лишнего)

Но вы могли бы бросить TestOC к ObservableCollection<MyClass>. Потому что TestOC действительно реализует все, что реализует ObservableCollection<MyClass>.


Это не работает:

TestOC test2 = new ObservableCollection<MyClass>(); 

Это делает работу:

ObservableCollection<MyClass> test2 = new TestOC(); 

Как я могу заставить ObservableCollection присваивать свой дочерний класс?

Вы не можете, но есть несколько вариантов:

1 - Вместо того, чтобы создать ObservableCollection<MyClass>, вы должны построить TestOC. (новый TestOC())

2 - Если вы не хотите писать ObservableCollection<MyClass> но сокращенный вариант, вы можете использовать псевдонимов, но это не добавляет никакой функциональности. Это всего лишь синтаксический сахар. Таким образом, вы могли бы new TestOC, но за ним находится ObservableCollection<MyClass>, который можно полностью назначить.

using TestOC = System.Collections.ObjectModel.ObservableCollection<MyClass>; 
Смежные вопросы