NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
jt.e
Člen
Avatar
jt.e:19.11.2015 21:25

Ahoj, mám zase jeden začátečnický dotaz:

Řekněme, že vytvořím nějakou třídu, s funkcí, která bude něco vypisovat do textu. A když budu chtít tuto třídu použít v jiných projektech bez úprav pro konzolovou aplikaci nebo pro WinForm co musím udělat?

Nevím jak to popsat, tak to raději předvedu:

příklad pro konzoli:

void Funkce()
{
 if(neco)Console.WriteLine("text");
}

pro Windows Form:

void Funkce()
{
 if(neco)MessageBox.Show("text");
}

univerzální funkce:

void Funkce()
{
 if(neco)
 {
  if(jsi_v_projektu_console_app) Console.WriteLine("text");
  else MessageBox.Show("text");
 }
}

Dá se to nějak řešit?

 
Odpovědět
19.11.2015 21:25
Avatar
Odpovídá na jt.e
Michael Škrášek:19.11.2015 21:31

Vytvoř novou knihovnu, dej tam tento kód a pak do jednotlivých projektů akorát přidáváš reference.

Nahoru Odpovědět
19.11.2015 21:31
"I choose a lazy person to do a hard job. Because that person will find an easy way to do it. " Bill Gates
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na jt.e
ostrozan:19.11.2015 23:00

Vlastní knihovna, jak psal Michal

Jinak dvě věci:
1). funkcím se v OOP říká metody, stejně jako se fukcím v C neříká po asemblerovsku podprogramy/rutiny - není to samoúčelné - funguje to mimo jiné jako rozlišení "o čem je řeč"

2). tvoje otázka je spíš řečnická - .NET nabízí všechno, co si jen dokážeš představit a ještě víc toho, co si jako začátečník ani předatavit nedokážeš. :)

 
Nahoru Odpovědět
19.11.2015 23:00
Avatar
Milan Křepelka
Tvůrce
Avatar
Odpovídá na Michael Škrášek
Milan Křepelka:20.11.2015 6:35

Tak jak je popsáno není vhodné dávat do jedné sdílené knihovny.
Je to matlání více prezentačních technologií do jedné knihovny. Takhle se to nedělá. Pak bys měl
IF console
IF WF
IF WPF
IF WEB
IF MOBILE
a nareferencované všechny assebmlies do sdílené knihovny, což jaksi popírá její primární funkci. Sdílené knihovny jsou prosty od těchto věcí, právě proto aby se daly používat samostatně, což znamená co nejmenší počet závislostí.

 
Nahoru Odpovědět
20.11.2015 6:35
Avatar
jt.e
Člen
Avatar
jt.e:20.11.2015 17:48

Díky za reakce.

Tato otázka mě na padla právě z toho důvodu, že znám C# pouze okrajově, a tak nevím, jestli už to není v C# třeba nějak "vytuněné".

funkcím se v OOP říká metody
Já myslel, že je to pouze záležitost slovníku.

 
Nahoru Odpovědět
20.11.2015 17:48
Avatar
Milan Křepelka
Tvůrce
Avatar
Odpovídá na jt.e
Milan Křepelka:20.11.2015 18:07

Vytunit to samozřejmě jde, ale spíš na úrovni OOP, programování přes rozhraní, DI apod.. S jazykem to nemá nic moc společného. S nějakými nepěkným vedlejšími efekty bys ses potýkal i na jiných platformách. To co chceš je prostě blbě tak nějak systémově.

Pokud bys měl nějakou výraznou společnou část která v tvém kódu je prezentována elementem něco. Potom "něco" by bylo vhodné odvelet to předka který by byl ve nějaké sdílené assembly(tedy v případě .NETu). Následně bys měl N potomků kteří by byly už v jiných projektech, každy jeden pro prezentační technologii - klienta. A v klientovi bys už "jenom" implementoval ty rozdíly které jsou specifické pro každého klienta.

Editováno 20.11.2015 18:10
 
Nahoru Odpovědět
20.11.2015 18:07
Avatar
Neaktivní uživatel:20.11.2015 18:59

Mě nějak uniká smysl takové funkce...

Nahoru Odpovědět
20.11.2015 18:59
Neaktivní uživatelský účet
Avatar
jt.e
Člen
Avatar
Odpovídá na Milan Křepelka
jt.e:20.11.2015 20:30

Původně jsem myslel něco, jako je třeba v C++ #ifdef UNICODE.., žádné složitosti.

Vaše reakce, jsem pochopil tak, že je třeba napsat kód tak, aby byl použitelný v "jakémkoliv" projektu a závislosti související s typem projektu, se řešili v konkrétním projektu. (krkolomně řečeno:) )

Editováno 20.11.2015 20:32
 
Nahoru Odpovědět
20.11.2015 20:30
Avatar
Ľuboš Čurgó
Tvůrce
Avatar
Odpovídá na jt.e
Ľuboš Čurgó:20.11.2015 22:08

To akym sposobom printujes text zalezi od konkretnej technologie. Ked mas nejaky text ktory potrebujes vypisat tak si bud vies spravit jednoduchu triedu ktora bude obsahovat metody/property co vracaju dany text

class Program
   {
       static void Main(string[] args)
       {
           Console.WriteLine(PrintMessage.Test);
       }
   }

   public static class PrintMessage
   {
       public static string Test = "test";
   }

Avsak omnoho lepsie by bolo pridat taketo texty napriklad do resource filu. Otvoris properties v projekte, najdes resources tab, pridas novy file. Potom volas len.

static void Main(string[] args)
{
    Console.WriteLine(Resources.Test);
}
 
Nahoru Odpovědět
20.11.2015 22:08
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na jt.e
ostrozan:20.11.2015 22:11

Jsem to ale hlupák :-) - už jsem myslím pochopil, o co ti jde - a všichni tě tu zbytečně mateme, protože jsme úplně mimo.

to co pořebuješ se jmenuje přetížená metoda, případně přetížený konstruktor
pokud jsi řádně studoval zdejší tutorial, tak víš o čem je řeč

i když fakt nevím jak zrovna na tvůj příklad udělat přetíženou metodu

pokud by ses spokojil s něčím takovým - to samozřejmě není přetížená metoda - odpovídalo by to tvé univerzální "funkci":

class Vypis
{
public enum Dest{console,msgBox};
private void VypisText(string text, Dest kam)
        {
        switch(kam)
                 {
                 case console: Console.WriteLine(text);break;
                 case msgBox:  MessageBox.Show(text);
                  }
        }

}


Vypis vypis=new Vypis();
//vypis do konzole
vypis.VypisText("ahoj konzole",console);
//vypis do messageBoxu
vypis.VypisText("ahoj messageBoxi",msgBox);
 
Nahoru Odpovědět
20.11.2015 22:11
Avatar
ostrozan
Tvůrce
Avatar
ostrozan:20.11.2015 22:22

metoda VypisText má být samozřejmě** public**

 
Nahoru Odpovědět
20.11.2015 22:22
Avatar
Milan Křepelka
Tvůrce
Avatar
Odpovídá na ostrozan
Milan Křepelka:21.11.2015 9:51

Jen si transformoval if do switche

 
Nahoru Odpovědět
21.11.2015 9:51
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na jt.e
Petr Čech:21.11.2015 10:44

Pokud pomineme fakt, že je ta funkce z hlediska návrhu úplně špatně, tak sdílení kódu se dělá takto:

  • Vytvoř si nový projekt typu "Class library", tam si napíšeš kód, co chceš použít i jinde.
  • Otevřeš si solution s projektem, kde chceš daný kód použít.
  • V solution exploreru klikneš pravým na solution ne na projekt a vybereš "add > exisiting project"
  • Najdeš *.csproj soubor projektu s kódem na znovupoužití.
  • Pro jistotu "project > rebuild all"

Máš hotovo. Abys mohl kód používat, musíš pochopitelně přidat příslušný using.
To ale nemění nic na tom, že kód, který se uvedl, je špatně a neměl bys to dělat.

Nahoru Odpovědět
21.11.2015 10:44
the cake is a lie
Avatar
jt.e
Člen
Avatar
Odpovídá na Petr Čech
jt.e:21.11.2015 13:48

Já jsem to blbě napsal, ve skutečnosti jsem to myslel tak, že při sestavení kompilátor rozhodne, kterou část kódu použije (teď chápu, že jsem tam to "if" neměl psát - to bylo zavádějící), ne že ta podmínka bude součástí budoucí aplikace.

Na mou otázku jste už odpověděli, a chápu, že kód musí být navržený jinak (v podstatě standardně - string předám třeba přes referenci v parametru).

 
Nahoru Odpovědět
21.11.2015 13:48
Avatar
Odpovídá na jt.e
Luboš Běhounek Satik:21.11.2015 13:54

Asi myslíš preprocesorové direktivy, C# to samozřejmě má, ale dost omezené oproti C++
https://msdn.microsoft.com/…d8yd1ha.aspx

Nahoru Odpovědět
21.11.2015 13:54
https://www.facebook.com/peasantsandcastles/
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na jt.e
ostrozan:21.11.2015 14:05

Takže jinak

ptáš se na:

  1. jak používat tvoji třídu v různých solutions ?

řešení ti potom dal czubehead výše

  1. jak zajistit, aby metoda stejného jména dělala různé věci?
  2. jak zjistit, v jakém typu aplikace se zrovna nacházíš?
  3. ani jedno z toho

Já osobně typuju b v kombinaci s c

 
Nahoru Odpovědět
21.11.2015 14:05
Avatar
ostrozan
Tvůrce
Avatar
ostrozan:21.11.2015 14:13

Sakra, zase pozdě :)

 
Nahoru Odpovědět
21.11.2015 14:13
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 17 zpráv z 17.