已编辑
这是我的 IAnimal 界面
interface IAnimal
{
string getName();
int getAge();
bool getGender();
void eat();
}
这是我的 IWalk 界面
interface IWalk
{
void walk();
}
这是我的 IBird 界面
interface IBird : IAnimal, IWalk
{
}
这是我的 IFlightless_bird 界面
interface IFlightless_bird : IBird
{
}
这是我的 Iswim 界面
interface ISwim
{
void swim();
}
这是我的 King_penguin 班
public sealed class King_penguin : IFlightless_bird, ISwim
{
private string name;
private int age;
private bool gender;
public King_penguin(string name, int age, bool gender)
{
this.name = name;
this.age = age;
this.gender = gender;
}
public string getName()
{
return this.name;
}
public int getAge()
{
return this.age;
}
public bool getGender()
{
return this.gender;
}
public void eat()
{
Debug.WriteLine("I ate!");
}
public void walk()
{
Debug.WriteLine("I walked!");
}
public void swim()
{
Debug.WriteLine("I swam!");
}
}
我有一个下拉列表,其中填充了与我的所有动物类同名的字符串。 1
这是StartForm表单的代码
public partial class StartForm : Form
{
public StartForm()
{
InitializeComponent();
}
private void btnCreateAnimal_Click(object sender, EventArgs e)
{
string selected = comboBoxAnimal.SelectedItem.ToString();
Debug.WriteLine(selected);
var createAnimal = new CreateAnimalForm(selected);
createAnimal.Show(this);
}
}
选择动物后,我想定义构造函数所需的参数。 2
这是CreateAnimalForm表单的代码
public partial class CreateAnimalForm : Form
{
string animal;
public CreateAnimalForm(string animal)
{
this.animal = animal;
InitializeComponent();
}
private void btnCreateAnimal_Click(object sender, EventArgs e)
{
bool gender;
string name = textBoxName.ToString();
int age = int.Parse(textBoxAge.Text);
if (radioButtonMale.Checked)
{
gender = true;
}
else
{
gender = false;
}
IAnimal AnyAnimal = new this.animal(name, age, gender);
}
}
当我定义了参数后,我希望能够按下按钮并使用定义的参数和选定的动物创建一个对象
答案 0 :(得分:1)
如果您在编译时了解所有动物,那么简单的 switch 就可以处理它。
private IAnimal CreateAnimal(string name, int age, bool gender)
{
return name switch {
nameof(King_penguin) => new King_penguin(name, age, gender),
_ => throw new NotSupportedException($"Unknown animal '{name}'")
};
}
答案 1 :(得分:1)
我用 AnimalFactory 解决了我的问题
public class AnimalFactory
{
List<Type> animals = new List<Type>();
public AnimalFactory()
{
LoadAnimals();
}
public IAnimal CreateInstance(string animalType, string name, int age, bool gender)
{
#region Linq
var animal = animals
.FirstOrDefault(a => a.Name == animalType);
return Activator.CreateInstance(animal, name, age , gender) as IAnimal;
#endregion
}
private void LoadAnimals()
{
string @namespace = "Zoo.Animals";
//Reflection
animals = Assembly.GetExecutingAssembly().GetTypes()
.Where(t => t.IsClass && t.Namespace == @namespace)
.Where(t => t.IsClass && !t.IsInterface)
.ToList();
}
}
当我知道我选择了哪个动物时,我将所有动物加载到一个列表中,并将它们与从 StartForm 获得的动物进行比较,然后创建此类的实例
我替换了这个代码:
private void btnCreateAnimal_Click(object sender, EventArgs e)
{
bool gender;
string name = textBoxName.ToString();
int age = int.Parse(textBoxAge.Text);
if (radioButtonMale.Checked)
{
gender = true;
}
else
{
gender = false;
}
IAnimal AnyAnimal = new this.animal(name, age, gender);
}
与:
private void btnCreateAnimal_Click(object sender, EventArgs e)
{
bool gender;
string name = textBoxName.ToString();
int age = int.Parse(textBoxAge.Text);
if (radioButtonMale.Checked)
{
gender = true;
}
else
{
gender = false;
}
IAnimal animal = new AnimalFactory().CreateInstance(this.animal, name, age, gender);
}