(flook @ Среда, 24 Августа 2005, 11:52) писал(а):за использование шаблонов в С
Привидите пример использования шаблонов в Си пожалуйста. Я утверждаю что там нет шаблонов. Так они могут использоваться только в ОО языках - С++, Java? C#
Модератор: Модераторы разделов
Извините, но я на этом форуме уже видел примеры кода на Си, написанного flook'ом -- и очень грамотные примеры; примеров вашего кода не видел. Так что думаю, он в этом деле более компетентен, нежели вы.(RuSNoteS @ Среда, 24 Августа 2005, 12:33) писал(а):Привидите пример использования шаблонов в Си пожалуйста. Я утверждаю что там нет шаблонов. Так они могут использоваться только в ОО языках - С++, Java? C#
Код: Выделить всё
struct window_area {
/* some fields */
void (*draw)(struct window_area *, ...);
}Код: Выделить всё
struct wnd_with_test {
struct window_area warea;
/* specific fields */
}
struct wnd_with_scroll {
struct window_area warea;
struct window_area *decorated;
/* specific fields */
}Код: Выделить всё
void draw_my_window(struct window_area *wnd)
{
...
wnd->display(wnd)
}Код: Выделить всё
/* for wnd_with_test
viod draw_text_window(struct window_area *wnd)
{
/* print all text */
}
/* for wnd_with_scroll */
viod draw_scroll_window(struct window_area *wnd)
{
draw_scroll();
recalculate_windows_offsets();
wnd->decorated->draw(wnd->decorated, ...); /* with new offsets */
}Код: Выделить всё
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})Код: Выделить всё
struct wnd_with_nicelooking_border {
/* specific fields */
struct window_area top_wnd;
}Код: Выделить всё
...
this_wnd = container_of(wnd, struct wnd_with_nicelooking_border, top_wnd);
...Код: Выделить всё
import junit.framework.*;
interface DrinkComponent {
String getDescription();
float getTotalCost();
}
class Mug implements DrinkComponent {
public String getDescription() {
return "mug";
}
public float getTotalCost() {
return 0;
}
}
abstract class Decorator implements DrinkComponent
{
protected DrinkComponent component;
Decorator(DrinkComponent component) {
this.component = component;
}
public float getTotalCost() {
return component.getTotalCost();
}
public abstract String getDescription();
}
class Espresso extends Decorator {
private float cost = 0.75f;
private String description = " espresso";
public Espresso(DrinkComponent component) {
super(component);
}
public float getTotalCost() {
return component.getTotalCost() + cost;
}
public String getDescription() {
return component.getDescription() +
description;
}
}
class Decaf extends Decorator {
private String description = " decaf";
public Decaf(DrinkComponent component) {
super(component);
}
public String getDescription() {
return component.getDescription() +
description;
}
}
class FoamedMilk extends Decorator {
private float cost = 0.25f;
private String description = " foamed milk";
public FoamedMilk(DrinkComponent component) {
super(component);
}
public float getTotalCost() {
return component.getTotalCost() + cost;
}
public String getDescription() {
return component.getDescription() +
description;
}
}
class SteamedMilk extends Decorator {
private float cost = 0.25f;
private String description = " steamed milk";
public SteamedMilk(DrinkComponent component) {
super(component);
}
public float getTotalCost() {
return component.getTotalCost() + cost;
}
public String getDescription() {
return component.getDescription() +
description;
}
}
class Whipped extends Decorator {
private float cost = 0.25f;
private String description = " whipped cream";
public Whipped(DrinkComponent component) {
super(component);
}
public float getTotalCost() {
return component.getTotalCost() + cost;
}
public String getDescription() {
return component.getDescription() +
description;
}
}
class Chocolate extends Decorator {
private float cost = 0.25f;
private String description = " chocolate";
public Chocolate(DrinkComponent component) {
super(component);
}
public float getTotalCost() {
return component.getTotalCost() + cost;
}
public String getDescription() {
return component.getDescription() +
description;
}
}
public class CoffeeShop2 extends TestCase {
public void testCappuccino() {
// В этом месте просто проверяем
// что не было выброшено исключений.
// Создаем простой капучино
DrinkComponent cappuccino = new Espresso(
new FoamedMilk(new Mug()));
System.out.println(cappuccino.
getDescription().trim() + ": $" +
cappuccino.getTotalCost());
}
public void testCafeMocha() {
// В этом месте просто проверяем
// что не было выброшено исключений.
// Создаем кофе без кофеина со взбитым
// кремом
DrinkComponent cafeMocha = new Espresso(
new SteamedMilk(new Chocolate(new Whipped(
new Decaf(new Mug())))));
System.out.println(cafeMocha.getDescription().
trim() + ": $" + cafeMocha.getTotalCost());
}
public static void main(String[] args) {
junit.textui.TestRunner.run(CoffeeShop2.class);
}
}(RuSNoteS @ Среда, 24 Августа 2005, 14:50) писал(а):Но вы же понмаете что приведенный вами код имитация использования шаблонов в Си - так же как и имитация использования классов на этом же языке.
Код: Выделить всё
#define class struct(RuSNoteS @ Среда, 24 Августа 2005, 14:50) писал(а):Честно гворя в приведенном коде я так и не увидел реализацию шаблона декоратор.
Скажем вот эталонная (эккелевская) реализция шаблона Декоратор
(RuSNoteS @ Среда, 24 Августа 2005, 14:50) писал(а):Может объясните непросвященному так_глубоко в Си как реализуется здесь шаблон?
(Еще один пример система ввода-вывода в Java)
(flook @ Среда, 24 Августа 2005, 14:59) писал(а):Я написал 7 небольших (по 5-6 строк) кусочков кода с пояснениями. Вы - 7 экранов кода БЕЗ комментариев. Можно я не буду втыкать в то, во что Вы сами не воткнули?
(RuSNoteS @ Среда, 24 Августа 2005, 15:35) писал(а):Тему же перенести хотели.
(Sparky @ Четверг, 25 Августа 2005, 8:40) писал(а):Да разговор не о шаблонах, как средстве языка (templates), а о шаблонах (паттернах), как методологии разработки. Та что каммент не в тему :P