2017-01-10 3 views
0

Если у меня есть структура типа Bag, которая реализует интерфейс IGetProps, и у меня есть класс Store, у которого есть переменная-член типа Bag, могу ли я указать в реализации Store, что я хочу, чтобы класс Store предоставлял IGetProps через своего члена type сумка.C#: Можно ли назначить класс-член класса исполнителем унаследованного интерфейса?

Сумка не может быть изменена на класс, чтобы я мог наследовать ее. IGetProps имеет много методов, поэтому я не хочу явно переносить каждый метод с помощью метода в Store.

например:

interface IGetProps 
{ 
    int GetA(); 
    int GetB(); 
} 

struct Bag : IGetProps 
{ 
    public int GetA() { return 0;} 
    public int GetB() { return 1;} 
    ... // Many more methods 
} 

class Store : IGetProps 
{ 
    private Bag bag;  // <--- Can I designate bag to be the provide of IGetProps for Store? 
} 
+0

Нет, вы не можете. Однако вы можете наследовать магазин из сумки. – dgorti

+0

Класс @dgorti не может наследовать от структуры. http://stackoverflow.com/questions/15408667/inherit-from-struct – Nico

+0

Почему 'Bag' является структурой? Поскольку вы указываете, что у нее есть _Many more methods_, это, по-видимому, указывает на то, что вместо этого следует использовать 'class', поскольку структуры, как правило, предназначены для моделирования неизменяемых объектов с семантикой типа значений. –

ответ

0

Простой ответ "Нет" ваш класс не может наследовать от structMSDN.

Наследование структур не существует, как и для классов. Строка не может наследовать от другой структуры или класса, а не может быть базой класса. Структуры, однако, наследуются от базового класса Object. A struct может реализовывать интерфейсы, и он делает это точно так же, как классы .

однако что-то подобное может работать, оно все еще обматывает методы, но делается как можно проще. Кроме этого другого пути не было бы.

interface IGetProps 
{ 
    int GetA(); 
    int GetB(); 
} 

struct Bag : IGetProps 
{ 
    public int GetA() { return 0; } 
    public int GetB() { return 1; } 
} 

class Store : IGetProps 
{ 
    private Bag bag;  // <--- Can I designate bag to be the provide of IGetProps for Store? 

    public int GetA() => bag.GetA(); // <--- c# 6.0 syntax for wrapping a method 

    public int GetB() => bag.GetB(); 
} 

Мы реализуем методы интерфейса, однако методы интерфейса будут выполняться GetA() и структур GetB() методов. Конечно, нам нужно назначить bag (т.е. переменную или свойство contrucutor).

class Store : IGetProps 
{ 
    public Store(Bag bag) 
    { 
     this.bag = bag; 
    } 

    private Bag bag;  // <--- Can I designate bag to be the provide of IGetProps for Store? 

    public int GetA() => bag.GetA(); 

    public int GetB() => bag.GetB(); 
}