2012-04-04 3 views
1

Я хочу создать набор классов, которые очень похожи и могут быть отброшены друг к другу. Моя идея состояла в том, что я бы создал объект интерфейса и реализовал его через базовый класс. Затем создайте дополнительные классы, которые наследуются от моей базы. Затем я мог бы использовать интерфейс для работы с общими (базовыми) методами и отбрасывать объект из объекта BASE в пользовательский.C# Типы литья из интерфейсов

interface ImyInterface { 

} 

public class MyBase : ImyInterface { 

} 

public class MyCustom1 : MyBase { 

} 

public class MyCustom2 : MyBase { 

} 


// in helper class 
public static MyBase GetGeneralOjbect() { 

    // get a generic base object 
    return new MyBase(); 
} 

// How I'm trying to use this 

MyCustom1 obj = GetGeneralOjbect() as MyCustom1; 

Это, похоже, работает, за исключением кастомизации оператора объекта. MyCustom1 всегда имеет значение null, хотя статический помощник GetGeneralOjbect возвращает хороший объект MyBase. Возможно, этого не может быть сделано, или я не делаю это правильно. Любой вход был бы оценен.

ответ

3

Это потому, что вы можете отливать MyCustom1 или MyCustom2 до MyBase, но не обязательно в другую сторону.

При создании MyBase через MyBase b = new MyBase();, b является MyBase, но не MyCustom2, поэтому литье b в MyCustom2 потерпит неудачу.

Что вы можете сделать:

MyBase b = new MyCustom2(); 
MyCustom2 c = b as MyCustom2(); 

Что вы не может сделать:

MyBase b = new MyCustom2(); 
MyCustom1 c = b as MyCustom1(); 
+0

Я подозревал, что это так. Думал, что я попытаюсь выполнить эту конкретную ситуацию, когда я делал, но не был уверен, что это было правильно. Спасибо за ваш вклад. –

+0

Ну ... вы * можете * сделать это ... он просто сработает и сгорит во время работы. 'MyCustom1 c = new MyCustom2();' даже не будет компилироваться даже при явном нажатии. – Servy

+0

Да, вы * можете * сделать это, но, как заметил OP, результат второго приведения будет «null». –

0

Рассматривали ли вы с помощью Factory Pattern?

0

Экземпляр MyCustom1 может использоваться всякий раз, когда ожидается случай MyBase, но MyBase не может быть использован, если ожидается MyCustom1.

1

В принципе, вы можете создать цепочку наследования, но не вниз. Допустим, вы имели следующий класс: иерархию

public class A { 
} 

public class B : A { 
} 

public class C : B { 
} 

Если экземпляр нового экземпляра типа B вы можете привести его к A, но не C.

1

«как» ключевое слово говорит: «если этот объект, который статически напечатанный как MyBase, имеет тип среды MyCustom1, а затем возвращает его мне, статически напечатанному как MyCustom1, в противном случае дайте мне нулевую ссылку ». Объект, который вы выполняете, имеет тип среды MyBase, а не MyCustom1, поэтому вы получаете нулевую ссылку.