Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Implementace interface pomocí property

Aktivity
Avatar
Petr Daříček:2.6.2021 13:22

Ahoj,
rád bych věděl jestli C# má něco co znám z Delphi a to implementace interfacu pomocí property objektu.
Tedy rád bych něco takového

interface IMy{
  bool A();
  int B();
}

class SomeClass: IMy{
        public IMy MyProperty {get; set;}
}

Přičemž třída SomeClass neimplementuje přímo interface IMy, ale implementuje ho jeho property a teď nějak jen říct že implementaci interfacu najde v property. Samozřejmě bych mohl vytvořit metody A a B a provolávat objekt z property MyProperty, ale tomu se chci právě vyhnout.

Díky

 
Odpovědět
2.6.2021 13:22
Avatar
JerryM
Člen
Avatar
JerryM:5.6.2021 19:32

ano, tohle se opravdu v Csharp dá udělat

interface IMy
  {
      bool A();
      int B();
  }

  class SomeClass : IMy
  {
      public bool A() { return false; }
      public int B() { return 0; }

      public IMy MyProperty { get; set; }
  }
 
Nahoru Odpovědět
5.6.2021 19:32
Avatar
JerryM
Člen
Avatar
JerryM:6.6.2021 8:58
interface IMy
{
    bool A();
    int B();
}

class SomeClass : IMy
{
    public bool A() { return false; }
    public int B() { return 0; }

    public IMy MyProperty
    {
        get
        {
            return new SomeClass();
        }
        set
        {

        }
    }
}
 
Nahoru Odpovědět
6.6.2021 8:58
Avatar
Odpovídá na JerryM
Petr Daříček:7.6.2021 8:58

Díky, ale to není přesně ono. V tvém případě třída SomeClass implementuje interface pomocí metod A, B a nikoli pomocí property MyProperty. Možná upřesním účel. Většinou se do třídy SomeClass injektuje přes konstruktor objekt který implementuje rozhraní IMy a celá ta syntaxe pak slouží jen k tomu abych nemusel psát someClass.MyPro­perty.A(), ale jen someClass.A().

class My:IMy{
        public bool A(){
          return false;
        }
        public int B(){
          return 0;
        }
}

class SomeClass:IMy
{
  public SomeClass(IMy my){
    this.MyProperty = my;
  }

  public IMy MyProperty{get;set;}
}

Děkuji

 
Nahoru Odpovědět
7.6.2021 8:58
Avatar
JerryM
Člen
Avatar
JerryM:7.6.2021 10:50

aha ... a jakej to má účel ??? protože ... proč inicializuješ public property v konstruktoru ????? to nedává smysl

 
Nahoru Odpovědět
7.6.2021 10:50
Avatar
JerryM
Člen
Avatar
JerryM:7.6.2021 12:40

ty si asi chtěl tenhle příklad co ?
https://drive.google.com/…pe5w_rF/view?…
ale ten je na web stránkách Microsoftu ...
jinak samozřejmě se to dá napsat bez toho interface .. ten je tam je proto aby mohl MS implementovat code-behind pro řízení obsluhy všech binding klauzulí.... chápeš jo ?
když se ponoříš do zdrojáku sem
https://uloz.to/…ntybasic-zip
tak bys to měl pochopit ..

 
Nahoru Odpovědět
7.6.2021 12:40
Avatar
Odpovídá na JerryM
Petr Daříček:8.6.2021 9:32

Ahoj jen přikládám příklad toho jak to udělat v Delphi. Jestli je ta property public nebo private to není tolik podstatné, pokud je to ale zpřístupněné přes interface, pak aspoň getter dám raději public.

type
  IMyInterface = interface
    procedure P1;
    procedure P2;
  end;
  TMyClass = class(TObject, IMyInterface)
    FMyInterface: IMyInterface;
    property MyInterface: IMyInterface read FMyInterface implements IMyInterface;
  end;
var
  MyClass: TMyClass;
  MyInterface: IMyInterface;
begin
  MyClass := TMyClass.Create;
  MyClass.FMyInterface := ...// some object whose class implements IMyInterface
  MyInterface := MyClass;
  MyInterface.P1;
end;

zdroj
http://docwiki.embarcadero.com/…g_Interfaces

 
Nahoru Odpovědět
8.6.2021 9:32
Avatar
Odpovídá na Petr Daříček
Patrik Valkovič:8.6.2021 10:46

Pokud vím, toto v C# nefunguje. Buď musíš interface implementovat třídou a metodami provolávat tvou property, nebo se musíš odkazovat přímo na property.

Nahoru Odpovědět
8.6.2021 10:46
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Odpovídá na Patrik Valkovič
Petr Daříček:8.6.2021 10:57

Dekuji za potvrzeni Patriku, vypada to tak.
Peta

 
Nahoru Odpovědět
8.6.2021 10:57
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Petr Daříček
vajkuba1234:8.1.2022 2:33

Nemel jsi nahodou na mysli explicitni implementaci interface? Viz treba

public interface IDog
{
    string Greet();
}

public interface ICat
{
    string Greet();
}

public class Animal : IDog, ICat
{
    string ICat.Greet() => "Meow";

    string IDog.Greet() => "Woof!";
}

public class Program
{
    void Main()
    {
        var animal = new Animal();

        string cat = ((ICat)animal).Greet();    //meow
        string dog = ((IDog)animal).Greet();    //woof
    }
}
Nahoru Odpovědět
8.1.2022 2:33
No hope, no future, JUST WAR!
Avatar
Odpovídá na vajkuba1234
Petr Daříček:12.1.2022 14:19

vajkuba1234
Dík za snahu, ale to je něco jiného, v tvém případě se jedná o kolizi dvou jmen metod v interfacech. Dnes už vím že to co jsem chtěl C# neumí, ale svedu bez toho žít. :-)

 
Nahoru Odpovědět
12.1.2022 14:19
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.