Come posso ereditare la variabile di un'interfaccia? [chiuso]

3

Attualmente sto studiando su più operazioni di ereditazione. Quello che ho imparato è che non possiamo ereditare più classi ma possiamo ereditare una classe e un'interfaccia, quindi ho solo bisogno di passare una classe a un'interfaccia. Come sotto

class a{}
class b{}
interface d{}
//class c:a,b{} That does not work
//class c:a,d{} or class c:b,d{} but these need to work

Se torno alla mia domanda il rispetto per l'operazione di eredità multipla, Ecco un programma completo che spiega il mio problema.

using System;
using System.Collections.Generic;
using System.Text;

namespace interface_ile_multiple_inheritance
{
  interface set_get
  {
    double _getx
    { get; }

    double _gety
    { get ; }

    protected double total;//I want to use it by inheriting
  }

  class set_items
  {
    protected double x;
    protected double y;
    public set_items(double _x, double _y)
    {
        x = _x;
        y = _y:
     }
  }

  class display : set_items, set_get
  {
    public display(double x, double y) : base(x, y) { }

    public  double _getx
    { get { return x; } }

    public double _gety
    { get { return y; } }

    public double total_res()
    {
        total = x + y;    // Error line 1 total does not exist
        return total;     //Error line 2 total does not exist
    }
  }

  class Program
  {
    static void Main(string[] args)
    {
        display disp1 = new display(12, 12);

        Console.WriteLine("Total:" + disp1.total_res().ToString());//HERE İ NEED TO FİND x+y
        Console.WriteLine("Area:" + (disp1._getx * disp1._gety).ToString());//HERE İ NEED TO FİND x*y
    }
  }
}

Anche se posso ereditare le firme delle proprietà dell'interfaccia, perché non posso ereditare la sua variabile intera?

    
posta Edvestemhem 16.11.2017 - 05:44
fonte

2 risposte

2

Non ho esperienza C # ma penso che questo sia un problema di OOP generale. Sto guardando questa domanda da un punto di vista di Java.

Prima terminologia:

interfacce implementa cosa deve essere fatto. Quando usi un'interfaccia parli di implementazione.

classi implementa come deve essere fatto. Quando usi una classe da cui ereditare, parli di ereditarla.

Ecco perché è possibile aggiungere valori e scrivere metodi appropriati nelle classi per ereditare, ma non nelle interfacce.

Tuttavia ciò non significa che non sia possibile definire variabili in un'interfaccia. Puoi, ma ci sono due problemi con quello che stai provando:

1).

Le variabili definite saranno simili alle costanti che potrebbero rendere inutile lo scopo della variabile.

In Java puoi chiamarli staticamente. Interface.variable

2).

Il secondo problema nel tuo caso dovrebbe essere lo stato protetto della tua variabile total .

Protected è praticamente una variabile privata con un'eccezione per le classi che la ereditano. Ma ricorda che le interfacce non sono ereditate, quindi la variabile è praticamente privata.

Di che uso sarebbe questa variabile come privato?

Il mio suggerimento:

Pensa se total è realmente parte dell'interfaccia o se non si adatta meglio all'implementazione esatta o alla classe ereditata.

    
risposta data 16.11.2017 - 08:12
fonte
1

Diciamo che hai un televisore. Sulla parte anteriore di esso , ci sono un interruttore "on / off", "channel up" e "channel down", "volume su" e "volume giù", e alcuni altri pulsanti. Questi pulsanti consentono all'utente di gestire il televisore.

All'interno del televisore ci sono un sacco di altri pulsanti per impostare le complesse impostazioni del televisore. Queste impostazioni e i pulsanti per gestire tali impostazioni non dovrebbero riguardare l'utente, sono per il tecnico televisivo per assicurarsi che il televisore funzioni come dovrebbe .

Questa distinzione tra i pulsanti per i pulsanti e per il tecnico è la distinzione principale tra private metodi / variabili e public metodi / variabili.

L'unico motivo per cui abbiamo un televisore è che l'utente lo usi e l'unico modo in cui l'utente può usarlo è attraverso i pulsanti sulla parte anteriore di esso. Allo stesso modo - l'unica ragione per cui abbiamo una classe è per le altre classi che lo usano, e l'unico modo in cui le altre classi possono usarlo è attraverso i metodi e le variabili che sono a loro disposizione, il public ones .

L'unica ragione per cui abbiamo i pulsanti per il tecnico all'interno del televisore è aiutare i pulsanti sul lato anteriore a funzionare correttamente. Allo stesso modo - l'unico motivo per cui abbiamo private metodi e variabili è di aiutare il public a funzionare correttamente .

Abbiamo un nome per i metodi e le variabili public di una classe. Lo chiamiamo "API". Nell'analogia televisiva, l'API è la raccolta di impostazioni e pulsanti disponibili per l'utente. Un'API è tutti i componenti di classe disponibili per altre classi.

Ora, diciamo che hai un'applicazione sul tuo smartphone che accende e spegne tutti i dispositivi elettrici di casa tua. L'applicazione può accendere e spegnere solo i dispositivi con un interruttore "On / Off". Dispositivi come un forno a microonde, non possono essere accesi e spenti dall'applicazione perché devono essere scollegati manualmente dall'alimentazione. Quindi l'applicazione deve assicurarsi che i dispositivi abbiano un interruttore "On / Off". In altre parole, dobbiamo assicurarci che tutti i dispositivi che vogliamo attivare o disattivare dispongano di un'API.

Questo è l'interfaccia.

Un'interfaccia è un modo per assicurarsi che diverse classi abbiano un'API comune.

Quindi scriviamo un'interfaccia C # attuale:

interface IHaveOnOffSwitch
{
    void TurnOn();
    void TurnOff();
}

Potremmo avere tre classi: TV , Radio e Microwave . TV e Radio hanno uno switch "On / Off", quindi implementano l'interfaccia:

class TV : IHaveOnOffSwitch
{
    private TvType type; // a random private variable

    void TurnOn()
    {
        // logic for turnning on
    }
    void TurnOff()
    {
        // logic for turning off
    }
}
class Radio : IHaveOnOffSwitch
{
    private RadioType type; // a random private variable 

    void TurnOn()
    {
        // logic for turnning on
    }
    void TurnOff()
    {
        // logic for turning off
    }
}

class Microwave
{

}

E ora i metodi dell'applicazione smartphone potrebbero essere scritti in questo modo:

void TurnDeviceOn(IHaveOnOffSwitch device)
{
    device.TurnOn();
}
void TurnDeviceOff(IHaveOnOffSwitch device)
{
    device.TurnOff();
}

Il motivo per cui l'applicazione utilizza l'interfaccia è sapere che i dispositivi hanno questa API, non importa quali siano le variabili private del dispositivo (come il tipo di televisione o il tipo di radio).

Ecco perché un'interfaccia non può avere metodi e variabili privati. Si tratta di ciò che la classe consente alle altre classi di fare con esso, e non di come la classe si occupi di esso internamente.

    
risposta data 16.11.2017 - 09:22
fonte

Leggi altre domande sui tag