このモデルの使用:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
#region Abstracts definitions
abstract class AnAbstract
{
public string Name { get { return this.GetType().Name; } }
public bool IsNumeric { get { return this is ANumericAbstract; } }
public /*abstract*/ string Description = default(string);
}
abstract class ANumericAbstract : AnAbstract
{
public /*abstract*/ double Min = double.MinValue;
public /*abstract*/ double Max = double.MaxValue;
}
abstract class ANonNumericAbstract : AnAbstract
{
public List<Object> objects = new List<Object>();
}
#endregion Abstracts definitions
#region Concrete definitions
class NumericImpl : ANumericAbstract
{
new public const string Description = "A numeric implementation";
new public const double Min = 0;
new public const double Max = 1000;
public NumericImpl()
{
}
}
abstract class AnotherImpl : ANonNumericAbstract
{
public AnotherImpl()
{
objects.Add("one");
objects.Add("two");
objects.Add("three");
}
}
class SideA : AnotherImpl
{
new public const string Description = "Disc side A";
}
class SideB : AnotherImpl
{
new public const string Description = "Disc side B";
}
#endregion Concrete definitions
partial class Parameter
{
public string Name { get; set; }
public string Description { get; set; }
public bool IsNumeric { get; private set; }
public double Min { get; private set; }
public double Max { get; private set; }
public List<Object> Values { get; private set; }
private Parameter()
{
Values = new List<Object>();
}
}
}
これで、私はいくつかの抽象プロパティ(、、)を持つことができるクラスの階層を定義するふりをし、階層Name
のDescription
最後IsNumeric
にそれらのプロパティを強制的に定義するいくつかのクラスがあるはずです。それらの場合、ANumericAbstract
追加の特定のプロパティ、たとえばMin
およびを持っている必要がありMax
ます。
ここに問題があります。
私は、ジェネリックを取り、そこからいくつかの値を読み取ってプロパティを入力するインスタンスを作成できるようにしようとしてParameter
いAnAbstract
ますParameter
。
Parameter<ANumericAbstract> ParamNum = new Parameter<NumericImpl>();
ここで、Parameter
コンストラクターは渡された型を受け取り、「空白を埋める」。言い換えれば、私は次のようなことを試みています:
using System;
namespace ConsoleApplication1 {
partial class Parameter
{
public static Parameter NewParameter<T>() where T : AnAbstract
{
Parameter Parameter = new Parameter();
// THESE DON'T WORK:
this.Name = T.Name;
this.Description = T.Description;
this.IsNumeric = T.IsNumeric;
if (this.IsNumeric)
{
this.Min = (T as ANumericAbstract).Min;
this.Max = (T as ANumericAbstract).Max;
}
else
{
foreach(Object val in (T as ANonNumericAbstract).Values)
{
this.Values.Add(val);
}
}
return Parameter;
}
}
class Program
{
private AnAbstract Number = new NumericImpl();
static void Main(string[] args)
{
}
// THESE DON'T WORK:
private static Parameter<ANumericAbstract> ParameterNum =
Parameter.NewParameter<NumericImpl>();
private static Parameter<ANonNumericAbstract> ParameterA =
Parameter.NewParameter<SideA>();
private static Parameter<ANonNumericAbstract> ParameterB =
Parameter.NewParameter<SideB>();
}
}
明らかに構文は無効ですが、正しい方向に進んでいるかどうかはわかりません。正しく使用していないジェネリック構文はありますか?私はそれで終わり、 JavaのtersGet
とSet
tersを使用する必要がありますか?この時点で、:-)
Parameter par = new Parameter { Name = NumericImpl.Name, /* ... */ };
もっと賢明に見えるかもしれません...