C # понижающий вопрос - PullRequest
       33

C # понижающий вопрос

0 голосов
/ 15 декабря 2010

Является ли это действительным и законным и понижающим в следующем случае:

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 ]

2 голосов
/ 15 декабря 2010

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

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

1 голос
/ 15 декабря 2010

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

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

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

...