WebResourceBase
これは、が実際に継承されることを前提としていResourceBase
ます。
残念ながら、暗黙的な演算子の見栄えを良くすることはできません-ジェネリックはここでは機能しません。
代替手段: ResourceBase を制約するジェネリック
私はそれを読み直し、あなたが何を求めているのかを理解したので、1つのオプションは、クラスを修正して、派生クラスを参照するジェネリックパラメーターを含めることです(自己参照のようなものです):
public abstract class ResourceBase
{ }
public abstract class WebResourceBase<T> : ResourceBase
where T : WebResourceBase<T>
{
public T LocalPath { get; set; }
public T FtpPath { get; set; }
}
public class JavaScript : WebResourceBase<JavaScript>
{
}
JavaScript
次に、プロパティLocalPath
ともFtpPath
タイプになっていることがわかりますJavaScript
。
これで、割り当ては次のタイプのみを受け入れJavaScript
ます。
new JavaScript()
{
LocalPath = new JavaScript("/path/goes/here/1.js"),
FtpPath = new JavaScript("ftp://path/goes/here/1.js")
}
このアプローチの利点は、基本プロパティが現在の型またはより派生したものになるように制約することです。
implicit
代替手段:演算子の代わりに明示的な解析を行う
LocalPath
およびFtpPath
変数を のままにしておく必要がある場合ResourceBase
、またはここでジェネリックを使用できない場合、暗黙の演算子が混乱し始めます。静的メソッドのような明示的なものを提供することをお勧めします:
new JavaScript()
{
LocalPath = JavaScript.Parse("/path/goes/here/1.js"),
FtpPath = JavaScript.Parse("ftp://path/goes/here/1.js")
}
class JavaScript
{
public static ResourceBase Parse(string s)
{
if (path.EndsWith(".js"))
return new JavaScript(path);
throw new Exception();
}
}
implicit
代替手段:演算子の代わりにクラス階層を解析する
コンストラクターを介して文字列を型に取り込むという概念を焼き付け、プロパティを読み取り専用でパブリックにします。
public abstract class ResourceBase
{ }
public abstract class WebResourceBase
{
public ResourceBase LocalPath { get; private set; }
public ResourceBase FtpPath { get; private set; }
protected abstract ResourceBase ParseLocalPath(string s);
protected abstract ResourceBase ParseFtpPath(string s);
}
public class JavaScript : WebResourceBase<JavaScript>
{
protected override ResourceBase ParseLocalPath(string s)
{
// etc.
}
protected override ResourceBase ParseFtpPath(string s)
{
// etc.
}
}
正直なところ、これのほとんどは、文字列から特定の型として設定された 2 つのプロパティを取得するだけでは少しやり過ぎに思えます。多くのオプションがあります。暗黙の演算子でさえ機能します。
一番わかりやすいものを選んでください。オペレーターのオーバーロードは、掘り下げない限り、やや隠されている傾向があります。