首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

我的設計模式之旅[7]:運用泛型改良 Adapter Pattern C++/CLI Template 繼承泛型參數

     編輯:關於C語言

C++/CLI 同時擁有 ISO C++ Template 與 CLI Generics。Template 允許繼承泛型參數,完美實現類別適配器泛型化:

Template 版類別適配器

template<typename T>
ref class DrawAdapter : public IDrawStrategy, public T {
public:
    virtual void draw() { paint(); }
};

完整程式碼

#include "stdafx.h"
using namespace System;

interface class IDrawStrategy { void draw(); };
interface class IPaint { void paint(); };

ref class Triangle : public IPaint { public: virtual void paint() { Console::WriteLine("Draw Triangle"); } };
ref class Circle : public IPaint { public: virtual void paint() { Console::WriteLine("Draw Circle"); } };
ref class Square : public IPaint { public: virtual void paint() { Console::WriteLine("Draw Square"); } };

template<typename T>
ref class DrawAdapter : public IDrawStrategy, public T {
public:
    virtual void draw() { paint(); }
};

ref class Grapher {
    IDrawStrategy^ _drawStrategy;
public:
    Grapher() : _drawStrategy(nullptr) {}
    Grapher(IDrawStrategy^ ds) : _drawStrategy(ds) {}
    void drawShape() { if (_drawStrategy != nullptr) _drawStrategy->draw(); }
    void setShape(IDrawStrategy^ ds) { _drawStrategy = ds; }
};

int main() {
    Grapher^ grapher = gcnew Grapher(gcnew DrawAdapter<Triangle>());
    grapher->drawShape();
    grapher->setShape(gcnew DrawAdapter<Circle>());
    grapher->drawShape();
    grapher->setShape(gcnew DrawAdapter<Square>());
    grapher->drawShape();
}

C# 嘗試失敗

// Error: Cannot derive from 'T' because it is a type parameter
class DrawAdapter<T> : IDrawStrategy, T { ... }

C# 2.0/3.0 均不支援繼承泛型參數。C++/CLI 因支援 Template,成為 .NET 語言中唯一能完美實現「繼承泛型參數」類別適配器改良的語言。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved