2013-12-03 4 views
0

, поэтому я увидел этот пример из stackoverflow , чтобы реализовать множественное наследование с помощью интерфейсов., моделируя множественное наследование в C#

interface ILARGESimulator 
{ 
} 

interface IUDPClient 
{ 
} 

class UDPClient : IUDPClient 
{ 
} 

class LargeSimulator : ILARGESimulator 
{ 
} 

class RemoteLargeSimulatorClient : IUDPClient, ILargeSimulator 
{ 
    private IUDPClient client = new UDPClient(); 
    private ILARGESimulator simulator = new LARGESimulator(); 

} 

Парень сказал «К сожалению, вам нужно будет написать методы обертки для членов. Множественное наследование в C# не существует. Однако, вы можете реализовать несколько интерфейсов.»

Почему мы все равно наследуем оба интерфейса?

class RemoteLargeSimulatorClient : IUDPClient, ILargeSimulator 

Если у вас возникли уже-отношения и вызова базовых объектов на производном классе, почему даже писать :IUDP, ILargeSimulator? не было бы просто

class RemoteLargeSimulatorClient 
{ 

хорошо?

+1

Я научился [предпочитать композицию (инкапсуляцию) и интерфейсы по наследованию] (http://stackoverflow.com/questions/49002/prefer-composition-over-inheritance). –

ответ

0

Множество class Наследование не существует в C#. В противном случае может быть наследовано от нескольких интерфейсов. Ваш пример - попытка разрешить наследование нескольких классов.

Сначала вы полностью понимаете интерфейс. Why are interfaces useful

1

Если вы не используете класс на интерфейсах, вы не можете передать его как IUDPClient или ILargeSimulator в другой код. Когда он сказал, что нужно добавить implentations вручную, он был в основном предлагаю вам сделать это:

interface ILargeSimulator 
{ 
    void Simulator_Method_1(); 
    void Simulator_Method_2(); 
} 

public class UDPClient : IUDPClient 
    { 
    public void UDPClient_Method_1() { /* do something here */ } 
    public void UDPClient_Method_2() { /* do something here */ } 
} 

interface IUDPClient 
{ 
    void UDPClient_Method_1(); 
    void UDPClient_Method_2(); 
} 

public class LargeSimulator : ILargeSimulator 
{ 
    public void Simulator_Method_1() { /* do something here */ } 
    public void Simulator_Method_2() { /* do something here */ } 
} 

public class RemoteLargeSimulatorClient : IUDPClient, ILargeSimulator 
{ 
    private IUDPClient client = new UDPClient(); 
    private ILargeSimulator large = new LargeSimulator(); 

    public void Simulator_Method_1() { this.large.Simulator_Method_1(); } 
    public void Simulator_Method_2() { this.large.Simulator_Method_2(); } 
    public void UDPClient_Method_1() { this.client.UDPClient_Method_1(); } 
    public void UDPClient_Method_2() { this.client.UDPClient_Method_2(); } 
} 

Затем вы можете создать экземпляр объекта RemoteLargeSimulatorClient и использовать его в качестве либо ILargeSimulator или IUDPClient:

static void DoSomethingWithClient(IUDPClient client) { /* etc */ } 
static void DoSomethingWithSimulator(ILargeSimulator simulator) { /* etc */ } 

static void Main(string[] args) 
{ 
    RemoteLargeSimulatorClient foo = new RemoteLargeSimulatorClient(); 
    DoSomethingWithClient(foo); 
    DoSomethingWithSimulator(foo); 
} 
+0

Благодарим вас за ответ. Теперь возникает вопрос: почему вы объявляете закрытый клиент IUDPClient = новый UDPClient(); частный ILargeSimulator большой = новый LargeSimulator(); почему не только частный UDPCClient клиента = новый UDPCClient() частного LargeSimulator большого = новый LargeSimulator() общественных недействительные Simulator_Method_1() {large.Simulator_Method_1();} и так далее. –

+0

Поскольку в реальном приложении вы не создадите эти объекты здесь, вы либо передадите переменные IUDPClient, и ILargeSimulator в конструктор, либо инициализируете их для инициализации. Таким образом, вы можете настроить его таким образом, чтобы UDPClient передавался в класс в вашем коммерческом приложении, но какой-то другой класс (например, UDPDummyClient) передается при запуске фреймворков для проверки работоспособности вашего кода. В модульном тестировании класс UDPDummyClient будет притворяться IUDPClient для вашего кода, но фактически не будет отправлять что-либо по реальной сети. –

+0

Чтобы уточнить, он пытался продемонстрировать, как многократное наследование может быть подделано (хотя и не очень хорошо, потому что оно грязное и подверженное ошибкам) ​​путем перенаправления вызовов на объекты реализации. Он не показал должным образом, как они созданы в первую очередь, это совершенно другая тема. –

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