最初に頭に浮かぶことから始めましょう。パターンではないようですが、OOPで使用しなければならない場合があります。まず、javaで例を書きます。 2種類の実装用のクラスを作成する必要があるとしましょう。たとえば、httpとhttpsを介してサイトに接続するためのクラスを作成する必要があります。これは小さな例です。たとえば、Opengl 2.0esとOpengl3.0 esでandroid用に描画する場合は、同じ方法を使用できます。この場合、より多くのコードがあり、私が与える方法でそれを行うと、コードは正常に見えます。しかし、もちろん、この方法は私が発明したものではなく、私自身がいつか本から読んだものです。そしてhttpsとhttp。これを行うには、インターフェイスを作成する必要があります。また、プロトコルのタイプに応じて、必要なクラスをこのインターフェイスに割り当てます。正確には覚えていませんが、OOPが頭脳を設定していることをどこかで読んだようです。これにより、有能で美しいコードを書くことができます。おそらくそうです。しかし、私はほとんどOOPでプログラミングしていません。そのため、多分私は非常に多くのコードを記述し、実際のプログラマーはより簡潔なコードを作成します。しかし、私はあなたに例を示したいと思います。これはjavaインターフェースです。
import java.net.*;
import java.io.*;
interface IProtocol {
public void connect ( URL url );
public URLConnection getConnection ( ) throws IOException;
}
ここでは、接続用とURLConnectionの取得用の2つの関数を宣言しています。これが機能するための2つのクラスがあります。
import java.net.*;
import java.io.*;
public class Http implements IProtocol {
public URL url;
public void connect ( URL url ) {
this.url = url;
}
public HttpURLConnection getConnection ( ) throws IOException {
return ( HttpURLConnection ) url.openConnection( );
}
}
import java.net.*;
import javax.net.ssl.*;
import java.io.*;
public class Https implements IProtocol {
public URL url;
public void connect ( URL url ) {
this.url = url;
}
public HttpsURLConnection getConnection ( ) throws IOException {
return ( HttpsURLConnection ) url.openConnection ( );
}
}
connectとgetConnectionで記述する必要のあるコードの量は重要ではありません。たとえば、私は小さなコードを選択しましたが、たとえばOpenglがプログラミングする場合、それは多くなる可能性があります。しかし、それは便利です。したがって、主な機能は残されています。
import java.net.*;
import java.io.*;
public class Main {
public static void main ( String[] args ) {
URL url = null;
try {
url = new URL ( "https://www.google.com" );
} catch ( MalformedURLException e ) {
return;
}
String protocol = url.getProtocol ( );
IProtocol prot = null;
switch ( protocol ) {
case "http": prot = new Http ( ); break;
case "https": prot = new Https ( ); break;
default: return;
}
prot.connect ( url );
URLConnection conn = null;
try {
conn = prot.getConnection ( );
} catch ( IOException e ) {
return;
}
conn.setDoOutput ( true );
}
}
Cでは、curlを使用でき、多くのコードを記述できませんが、Cを使用してこの例をどのように解決できますか?Cにはポインターがあります-それがその力です。そして、これがCの例です-メイン関数です。main.c
ファイル
#include <stdio.h>
#include "conn.h"
struct conn conn;
#define HTTP_PROTOCOL 1
#define HTTPS_PROTOCOL 2
#define ERROR_PROTOCOL -1
static int get_protocol ( void ) {
return HTTP_PROTOCOL;
}
int main ( int argc, char **argv ) {
switch ( get_protocol ( ) ) {
case HTTP_PROTOCOL: init_http ( &conn ); break;
case HTTPS_PROTOCOL: init_https ( &conn ); break;
case ERROR_PROTOCOL: return -1;
}
conn.connect ( "www.google.com" );
char *data = conn.read ( );
}
conn構造は、別のファイルで宣言されています。conn.h
ファイル
#ifndef __CONN__
#define __CONN__
struct conn {
void ( *connect ) ( const char *url );
char *( *read ) ( void );
};
void init_http ( struct conn *conn );
void init_https ( struct conn *conn );
#endif
httpに必要なinit_httpに割り当てられたスコープファイル全体があります。
ファイルhttp.c
#include "conn.h"
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
static int sockfd;
static void connect_http ( const char *url ) {
sockfd = socket ( AF_INET, SOCK_STREAM, 0 );
}
static char *read_http ( void ) {
return NULL;
}
void init_http ( struct conn *conn ) {
conn->connect = connect_http;
conn->read = read_http;
}
init_httpsにはSslが追加で必要です。したがって、このファイルには、この接続に必要なすべてのデータが含まれます。
ファイルhttps.c
#include "conn.h"
#include <sys/types.h>
#include <sys/socket.h>
#include <openssl/ssl.h>
#include <stdio.h>
static int sockfd;
static SSL *ssl;
static void connect_https ( const char *url ) {
sockfd = socket ( AF_INET, SOCK_STREAM, 0 );
}
static char *read_https ( void ) {
return NULL;
}
void init_https ( struct conn *conn ) {
conn->connect = connect_https;
conn->read = read_https;
}
記事が気に入ったら、今後続編を書きます。まだ例を書くのに十分なOOPを知らないかもしれませんが、OOPをあきらめなければ、初心者の読者は構造化プログラミングとOOPプログラミングで書くときの違いに興味があると思います。