2010-12-15 5 views
0

ли действительным и законным и вниз отлитый в следующем случае:C# вниз литье вопрос

public interface IA { 
    string Property1 {get;} 
} 
public class B { 
    public string Name {get;set;} 
} 

// class A doesn't have it's own fields, all IA methods/properties are implemented through B methods 
public class A:B,IA 
{ 
    public string Property1 
    { 
     get {return this.Name} 
    } 
} 
..... 
B b = new B(); 
A a = (A)b; // will it work ? 

Или лучше использовать состав/агрегации?

public class A :IA 
{ 
    private B b; 
    .... 
    public string Property1 {get {return b.Name;} } 
    public A(B b) {this.b = b} 
} 
.... 
B b= new B(); 
A a = new A(b); 

ответ

2

Первый пример не будет работать, поскольку A is-a B; экземпляр типа B может быть A, но в вашем случае это не так. Кастинг завершится неудачно, и во время выполнения вы получите InvalidCastException.

Второй пример будет работать, поскольку он будет скомпилировать и выполнить, как вы ожидаете. Но, не зная больше подробностей о вашей реальной проблеме (не проблема с макетами), я не могу сказать, правильно ли это.

+0

Я интерпретировал код как неудачный, потому что B не является A, поэтому отливка невозможна в первом случае. Я на неправильном конце палки? – 2010-12-15 18:25:53

+0

@ Тим: Совсем нет. Это то же самое, что я сказал, просто с разными словами. :) – cdhowie 2010-12-15 18:29:50

1

Нет, это не законно. A Cat является Animal, но Animal необязательно является Cat (замените A на Cat и B на Animal в вашем примере).

Композиция может не иметь смысла, так как примеры Cat и Animal показаны снова. Композиция обычно имеет отношение «имеет», а Animal не имеет Cat.

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

Смежные вопросы