良い一日、
私が問い合わせているプロセスを 1 文で適切に説明する方法がわからないので、タイトルをお許しください。基本クラスやインターフェイスのユーザーが、オブジェクト自体や他のオブジェクトによってデフォルト以外の方法で認識されるデータを確実に割り当てる方法を探していました。だから私は次のことをしてきました:
struct ExampleInterface {
virtual void SomeMethod() = 0;
virtual std::string WhatLooksLikeAGetterButIsNot() = 0;
};
以下は実際の例です。
//So states can be "poped in and out".//
struct State
{
//To retrive what the active state is called.//
/*Code In Question--->*/virtual std::string RegardStateAs() = 0;/*<---Code In Question*/
virtual void ExecuteState( VRGE::MDNode* metaData ) = 0;
};
アイデアは、最終的に A のようなことをすることです (このオプションにより、誰かが「更新」から派生した場合に発生を防止しようとする問題が可能になります):
struct Update : public State
{
//Yadda yadda...//
/*Code In Question--->*/std::string RegardStateAs() {
return std::string{ "Update" };
}/*<---Code In Question*/
};
B (このオプションでは、A が行うことはできません):
struct Update : public State
{
//Yadda yadda...//
//Not a good example, but the point gets across.//
Update( std::string value ) {
stateName = value;
}
/*Code In Question--->*/virtual std::string RegardStateAs() {
return stateName;
}/*<---Code In Question*/
private:
std::string stateName;
};
私の質問は次のとおりです。これは良い習慣ですか、それとも悪い習慣ですか?
- - -編集 - - -:
これをコンパイルできるコンパイラにアクセスできませんが、この状況では「オーバーライド」が最適であると指摘されました。たとえば、次のようになります。
//So states can be "poped in and out".//
struct State
{
//To retrive what the active state is called.//
/*Code In Question--->*/virtual std::string RegardStateAs() = 0;/*<---Code In Question*/
virtual void ExecuteState( VRGE::MDNode* metaData ) = 0;
};
struct Update : public State
{
//Yadda yadda...//
/*Code In Question--->*/std::string RegardStateAs() override {
return std::string{ "Update" };
}/*<---Code In Question*/
};