0

次のように、抽象メソッドの1つを呼び出す抽象クラスがあります。

public abstract class VirtualAsset : ISerializable
{
    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        SerializeAsset(info);
    }

    public abstract void SerializeAsset(SerializationInfo info);
}

問題は、私がユーザー入力を信頼しているため、悪意のあるユーザー(または自分が何をしているのかわからないユーザー)が、仮想資産のインスタンスではなく、仮想資産のインスタンスを渡そうとする可能性が高いことです。必要な抽象関数を実装するサブクラス...実際、これを意図的に実行すると、プログラムはエラーなしでクラッシュします。

try-catchを使用してみましたが無駄になりました...この問題を効果的に処理するための最良の方法は何ですか?オーバーライド可能なメソッドを呼び出すたびにself.GetType()をチェックする必要がありますか?

4

2 に答える 2

2

問題は、私がユーザー入力を信頼しているため、悪意のあるユーザー(または自分が何をしているのかわからないユーザー)がVirtualAssetのインスタンスを渡そうとする可能性が高いことです。

いいえ、できません。定義上、抽象クラスをインスタンス化することはできません。のインスタンスを作成できる人は誰もVirtualAssetいません。また、抽象メソッドを実装しない派生クラスも抽象である必要があります。

于 2012-11-15T00:27:52.363 に答える
0

抽象クラスのインスタンスを作成できないため、検証可能なコードではこの問題は発生しません。

ここで、クラスの名前を渡してそのようなクラスを作成しようとすると、作成は失敗します。抽象クラスを作成できないため失敗しますが、抽象メソッドを呼び出そうとするため失敗しません。

于 2012-11-15T00:28:22.320 に答える