Как уменьшить дублирование кода в классе с членами данных с тем же именем, но с другим типом? - PullRequest
2 голосов
/ 08 мая 2009

У меня проблемы при разработке таких классов, как этот

class C1 {
public:
  void foo();
}

class C2 {
public:
  void foo();
}

C1 и C2 имеют одинаковый метод foo (),

class Derived1 : public Base {
public:
  void Update() {
    member.foo();
  }
private:    
  C1 member;
}

class Derived2 : public Base {
public:
  void Update() {
    member.foo(); 
  }
private:    
  C2 member;
}

Update () обоих производных классов абсолютно одинаковы, но тип члена отличается. Поэтому мне нужно скопировать реализацию Update для каждого нового производного класса.

Это способ уменьшить дублирование кода? Я только выхожу с решением с макросом. Я думаю, что есть более элегантный способ решить это с помощью шаблона, но я не могу понять это ..

EDIT: Большое спасибо, ребята, но я думаю, что что-то пропустил ..

1.Я пользуюсь с ++

2. В действительности каждый класс Derived имеет около 5 членов, все они предоставляют метод foo () и являются производными от одного базового класса. Моя ситуация такова, что я уже написал (очень длинный) метод Update (), и он может работать для любого производного класса без каких-либо изменений. Поэтому я просто копирую и вставляю этот Update () в каждый новый класс Update (), и это приводит к ужасному дублированию кода. Интересно, есть ли способ, которым мне не нужно переписывать Update () слишком много, и это может уменьшить дублирование.

спасибо еще раз

Ответы [ 4 ]

6 голосов
/ 08 мая 2009

Это именно то приложение, для которого разработаны шаблоны классов. Они позволяют функциям в классе работать с различными типами данных без необходимости копировать алгоритмы и логику.

Эта страница Википедии даст вам хороший обзор шаблонов в программировании.

Вот основная идея, с которой можно начать:

template  <class T>
class CTemplateBase
{
public:
    void Update()
    {
        member.foo();
    }
private:
    T member; // Generic type
}

class CDerived1 : public CTemplateBase<C1>
{
    // No common algorithms required here
}

class CDerived2 : public CTemplateBase<C2>
{
    // No common algorithms required here
}
0 голосов
/ 08 мая 2009

Если ваши Drived1 и Derived2 совпадают, за исключением типа (C1 и C2) члена, то вы можете рассмотреть возможность использования одного класса Derived и шаблона. (Извините, если мой синтаксис неверен, я C # dev: D)

template <class T>
class Derived : public Base {
public:
  void Update() {
    member.foo();
  }
private:    
  T member;
}

Что-то в вышеприведенных строках.

0 голосов
/ 08 мая 2009

Переместить метод в родительский класс:

class IFooable {
public:
  virtual void foo() = 0;
}

class C1 : IFooable {
public:
  void foo();
}

class C2 : IFooable {
public:
  void foo();
}

class Base {
public:
  void Update() {
    member->foo(); 
  }
private:    
  IFooable* member
}

class Derived1 : public Base {
  Derived1 () : member(new C1()) {}
  ~Derived1 () { delete member; }
}

class Derived2 : public Base {
  Derived2 () : member(new C2()) {}
  ~Derived2 () { delete member; }
}
0 голосов
/ 08 мая 2009

Если у вас есть контроль над C1 и C2, вы можете определить базовый класс или абстрактный базовый класс и обработать его в Базовом классе или в третьем вспомогательном классе.

...