Diskuze: test
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Neregistrovaný

Zobrazeno 35 zpráv z 35.
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
To podle tohohle malého kousku nepoznáme, ale vypadá to na první pohled
funkčně, jen název třídy Class1 není moc vypovídající
Podle názvů tříd soudím, že jsi dědičnost nepochopil. Podle obsahů tříd zase že jsi nepochopil OOP. Zkus si vymyslet nějaký jiný příklad, třeba se zvířaty v ZOO.
Netuším, proč by třída Form1 měla být potomkem třídy Class1. Co je to Form1? Co je to Class1? Tyto třídy neznám.
Nedokázal jsi nic. Jen jsi napsal pár nesmyslných příkazů, které nijak nesouvisí s realitou a tedy ani s OOP.
Tak jsem to zkusil znovu. Tentokrát jsem si udělal přihlašovací formulář, který obsahuje 2x textBox (accountName, accountPassword) a 2x button (user, admin) Po kliknutí na jedno z tlačítek by měl program vypsat v MessageBoxu Name a Password. Jenže nevypíše. Můžete se na to někdo mrknout prosím? Předem děkuji.
PROJECT
http://uloz.to/…edicnost-rar
Zde je CODE, ale mrkněte raději na celý projekt, zda jsou nastaveny správně modifikátory u textBoxů a tlačítek.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Dědičnost
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void user_Click(object sender, EventArgs e)
{
User newUser = new User();
}
private void admin_Click(object sender, EventArgs e)
{
Admin newAdmin = new Admin();
}
}
// ///////////////////////////////////
public partial class Account : Form1
{
private string name;
private string password;
protected void Loggin()
{
name = accountName.Text;
password = accountPassword.Text;
MessageBox.Show(String.Format("Ahoj {0}. Tvé heslo je {1}.", name, password));
}
}
// //////////////////////////////////
public partial class User : Account
{
public User()
{
Loggin();
}
}
// /////////////////////////////////
public partial class Admin : Account
{
public Admin()
{
Loggin();
}
}
}
V namespace nepoužívej diakritiku. Proč všechny třídy dědí od Formu?
Očividně nevíš co dělá slovo partial a vypsat by ti to mělo prázdné stringy, protože nepracuješ s tou instancí formu, která je jakoby ta hlavní, ale s další (novou). Jak už řekl Satik, tak to dědění formu taky nechápu - naco?
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void user_Click(object sender, EventArgs e)
{
Account newUser = new User(accountName.Text, accountPassword.Text);
newUser.Loggin();
}
private void admin_Click(object sender, EventArgs e)
{
Account newAdmin = new Admin(accountName.Text, accountPassword.Text);
newAdmin.Loggin();
}
}
public abstract class Account
{
protected string name;
protected string password;
public Account(string name, string pw)
{
this.name = name;
password = pw;
}
public virtual void Loggin()
{
MessageBox.Show(String.Format("Ahoj {0}. Tvé heslo je {1}.", name, password));
}
}
public class User : Account
{
public User(string name, string pw)
: base(name, pw)
{ }
public override void Loggin()
{
MessageBox.Show(String.Format("Ahoj uživateli {0}. Tvé heslo je {1}.", name, password));
}
}
public class Admin : Account
{
public Admin(string name, string pw)
: base(name, pw)
{ }
public override void Loggin()
{
MessageBox.Show(String.Format("Ahoj admine {0}. Tvé heslo je {1}.", name, password));
}
}
Konstruktory ve třídách User a Admin jsou zcela zbytečné. Stačí ve třídě Account metodu Loggin přejmenovat na Account a je to.
V metodě user_Click() vytvoříš objekt newUser a hned ho zahodíš. Proč?
Jo teď se ještě dívám na ty modifikátory těch textboxů. Rychle se to odnauč, to je snad největší prasárna jakou znám.
Pro všechny: nenastavujte nikdy control (textbox, label, button...) na public!!! Když už potřebujete něco z něj zjistit, udělejte si getter na tu danou vlastnost co potřebujete, ale rozhodně jí nedávejte na public.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Dědičnost
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
// click USER:
private void user_Click(object sender, EventArgs e)
{
Account newUser = new User(accountName.Text, accountPassword.Text);
newUser.Loggin();
}
// click ADMIN:
private void admin_Click(object sender, EventArgs e)
{
Account newAdmin = new Admin(accountName.Text, accountPassword.Text);
newAdmin.Loggin();
}
}
// ACCOUNT class:
public abstract class Account
{
protected string name;
protected string password;
public Account(string name, string password)
{
this.name = name;
this.password = password;
}
public virtual void Loggin()
{
}
}
// USER class:
public class User : Account
{
public User(string name, string password): base(name, password)
{}
public override void Loggin()
{
MessageBox.Show(String.Format("Ahoj uživateli {0}. Tvé heslo je {1}.", name, password));
}
}
// ADMIN class:
public class Admin : Account
{
public Admin(string name, string password): base(name, password)
{}
public override void Loggin()
{
MessageBox.Show(String.Format("Ahoj admine {0}. Tvé heslo je {1}.", name, password));
}
}
}
Takže zde se využije dědičnost i polymorfismus? Jestli jsem to správně pochopil, tak polymorfismus využíváme zde:
public virtual void Loggin()
{
}
public override void Loggin()
{
MessageBox.Show(String.Format("Ahoj uživateli {0}. Tvé heslo je {1}.", name, password));
}
Tak naposled:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void loggin_Click(object sender, EventArgs e)
{
if(user.Checked)
{
Account newUser = new User(accountName.Text, accountPassword.Text);
newUser.Loggin();
}
else if(admin.Checked)
{
Account newAdmin = new Admin(accountName.Text, accountPassword.Text);
newAdmin.Loggin();
}
}
}
// ACCOUNT class:
public abstract class Account
{
protected string name;
protected string password;
public Account(string name, string password)
{
this.name = name;
this.password = password;
}
public virtual void Loggin()
{
// polymorfismus
}
}
// USER class:
public class User : Account
{
public User(string name, string password): base(name, password)
{}
// přepsání metody:
public override void Loggin()
{
MessageBox.Show(String.Format("Ahoj uživateli {0}. Tvé heslo je {1}.", name, password));
}
}
// ADMIN class:
public class Admin : Account
{
public Admin(string name, string password): base(name, password)
{}
// přepsání metody:
public override void Loggin()
{
if ((name == "admin") && (password == "heslo"))
{
MessageBox.Show(String.Format("Ahoj admine {0}. Tvé heslo je {1}.", name, password));
}
else
MessageBox.Show("Zadal jste špatné přihlašovací údaje nebo nejste admin!");
}
}
<a href="http://2i.cz/d8f594be6d" target="_blank"> 2i - image hosting zdarma</a>
Skúsim to.
<img src="http://2i.cz/d8f594be6d]
[img]http://2i.cz/2i/t/d8f594be6d.jpg" alt="email" />
Edit.
Nefunguje to takto.
Co takhle:
http://2i.cz/d8f594be6d
?
A co takhle kliknout na Zvolit soubory pod polem pro vkládání komentářů
?
EDIT: sdraco, už chápu proč sem zakazuješ přístup malým dětem...
libco ten soubor nemá, on ho sem chtěl dát za NoName, ne?
To já nevím, jen říkám jak se sem nahrávají obrázky...
Až na to, že když nejsem registrovaný, tak nemohu přidávat obrázky.
Regnu. Jen jsem reagoval na:
"A co takhle kliknout na Zvolit soubory pod polem pro vkládání komentářů
?EDIT: sdraco, už chápu proč sem zakazuješ přístup malým dětem..."
Takže 1) já tam možnost Zvolit soubory nemám 2) nejsem dítě.
A co se týče mých chyb, tak C# studuji asi měsíc. Předtím jsem programoval mikrokontroléry v klasickým C a tam je to něco úplně jiného (přiřazuješ registrům různé hodnoty)
Zobrazeno 35 zpráv z 35.