C# - 在另一个方法中实现抽象或接口方法
C# - Implement abstract or interface method inside of another method
我正在尝试在另一个基于 switch case 的方法中实现一个抽象或接口方法。根据给定的索引,我想实现不同的方法。
代码
public interface choices
{
void Effect ();
}
public class Imple : choices
{
public void Choose(int index)
{
if(index == 1)
{
void Effect()
{
// implementation here
}
else if(index == 2)
// etc.
}
}
}
是否可以通过覆盖抽象方法来完成?
谢谢。
--- 编辑 ---
我明白上面提供的代码和解释不清楚,所以我会尽量解释得更好。
我正在创建一个 Unity 游戏,但是我遇到的问题与接口和 c# 方法实现有关,这就是我没有询问 Unity 论坛的原因。对于这个游戏,我拥有不同属性(伤害和智力、占用双手等统计数据)的武器,效果很好。
项目Class(基础class)
public class Item
{
// stats and getters / setters
}
武器Class
public class Weapon : Item
{
public void Attack()
{
// attack enemies and reduce their health
// I want the Effect method to activate when attacking,
// if the method has been implementd
}
}
我希望能够在 运行 时间创建能够执行效果的不同方法,例如在击中敌人时造成更多伤害。但是,我想根据与效果对应的索引在 运行 时间实现这些方法。原因是武器存储在一个 json 文件中,在解析它时,这个索引将有助于识别武器具有哪种效果。因此,如果索引为 1,则实施应允许武器造成额外伤害,但如果为 2,则会产生不同的效果。为此,我创建了一个 OnHit class 和一个 IOnHit 接口,如下所示:
public class OnHit : IOnHit
{
public void Effect()
{
// empty
}
}
public interface IOnHit
{
void Effect();
}
我正在寻找一种动态实现的方法。我想到这样做的一种方法是拥有一个具有所有效果的静态 class,然后将索引传递到那里并继续。然而,这对游戏来说是有问题的,因为每次玩家攻击时它都必须循环通过一个开关盒(或者 2 个,如果玩家有 2 把武器)。所以,我正在寻找一种方法来拥有一个接口或一个抽象 class,其中包含可以实现一次的抽象方法,然后在武器效果发生时调用。我的想法是在武器对象中创建一个 OnHit class 的实例,并在那里创建一个 IOnHit 接口 link。然后,像这样实现里面的代码:
public class Weapon : Item
{
OnHit oh = new OnHit();
IOnHit ioh = oh;
public void Attack()
{
// previous attack method
if(ioh.Effect is implemented)
ioh.Effect();
}
public void SetIndex(int index)
{
switch{
case 1:
ioh.Effect()
{
// implementation of the effect
}
break;
case 2:
ioh.Effect()
{
// implementation of different effect
}
break;
}
}
}
其中 index 参数是效果的 id,从解析的 json.
中提取
再次感谢。
如果您尝试做的是根据传递给 Choose
的参数更改 Effect
的实现行为,那么您将不得不使用状态字段来存储它并且在 Effect
中阅读,像这样
public class Imple : choices
{
private int effectNum = 1; // set the default effect here
public void Choose(int index)
{
effectNum = index;
}
public void Effect()
{
switch (effectNum)
{
case 1: // implement the different effects here
break;
case 2:
break;
}
}
}
你想做的是委派。
所以在class实现中,你会创建两个private或者protected方法来实现效果。
然后当您调用 Choose
方法时,它会将您创建的委托引用字段也设置为指向所需的方法。
现在您的 Effect
方法调用委托引用,如果不是 null(已初始化)。
static void Test()
{
var instance = new Imple();
instance.Choose(2);
instance.Effect();
}
public interface choices
{
void Effect();
}
public class Imple : choices
{
private Action SelectedEffect;
public void Effect()
{
if ( SelectedEffect != null ) SelectedEffect();
}
private void Effect1()
{
Console.WriteLine("Effect1 called.");
}
private void Effect2()
{
Console.WriteLine("Effect2 called.");
}
public void Choose(int index)
{
switch ( index )
{
case 1:
SelectedEffect = Effect1;
break;
case 2:
SelectedEffect = Effect2;
break;
default:
throw new NotImplementedException("Effect version n°" + index);
}
}
}
Effect
可以指向来自任何 class:
的任何方法
case 1:
SelectedEffect = SomeReference1.SomeMethod;
break;
case 2:
SelectedEffect = SomeReference2.SomeMethod;
break;
您可以用任何方法签名替换 Action
以匹配参数和任何返回类型。
我正在尝试在另一个基于 switch case 的方法中实现一个抽象或接口方法。根据给定的索引,我想实现不同的方法。
代码
public interface choices
{
void Effect ();
}
public class Imple : choices
{
public void Choose(int index)
{
if(index == 1)
{
void Effect()
{
// implementation here
}
else if(index == 2)
// etc.
}
}
}
是否可以通过覆盖抽象方法来完成? 谢谢。
--- 编辑 ---
我明白上面提供的代码和解释不清楚,所以我会尽量解释得更好。
我正在创建一个 Unity 游戏,但是我遇到的问题与接口和 c# 方法实现有关,这就是我没有询问 Unity 论坛的原因。对于这个游戏,我拥有不同属性(伤害和智力、占用双手等统计数据)的武器,效果很好。
项目Class(基础class)
public class Item
{
// stats and getters / setters
}
武器Class
public class Weapon : Item
{
public void Attack()
{
// attack enemies and reduce their health
// I want the Effect method to activate when attacking,
// if the method has been implementd
}
}
我希望能够在 运行 时间创建能够执行效果的不同方法,例如在击中敌人时造成更多伤害。但是,我想根据与效果对应的索引在 运行 时间实现这些方法。原因是武器存储在一个 json 文件中,在解析它时,这个索引将有助于识别武器具有哪种效果。因此,如果索引为 1,则实施应允许武器造成额外伤害,但如果为 2,则会产生不同的效果。为此,我创建了一个 OnHit class 和一个 IOnHit 接口,如下所示:
public class OnHit : IOnHit
{
public void Effect()
{
// empty
}
}
public interface IOnHit
{
void Effect();
}
我正在寻找一种动态实现的方法。我想到这样做的一种方法是拥有一个具有所有效果的静态 class,然后将索引传递到那里并继续。然而,这对游戏来说是有问题的,因为每次玩家攻击时它都必须循环通过一个开关盒(或者 2 个,如果玩家有 2 把武器)。所以,我正在寻找一种方法来拥有一个接口或一个抽象 class,其中包含可以实现一次的抽象方法,然后在武器效果发生时调用。我的想法是在武器对象中创建一个 OnHit class 的实例,并在那里创建一个 IOnHit 接口 link。然后,像这样实现里面的代码:
public class Weapon : Item
{
OnHit oh = new OnHit();
IOnHit ioh = oh;
public void Attack()
{
// previous attack method
if(ioh.Effect is implemented)
ioh.Effect();
}
public void SetIndex(int index)
{
switch{
case 1:
ioh.Effect()
{
// implementation of the effect
}
break;
case 2:
ioh.Effect()
{
// implementation of different effect
}
break;
}
}
}
其中 index 参数是效果的 id,从解析的 json.
中提取再次感谢。
如果您尝试做的是根据传递给 Choose
的参数更改 Effect
的实现行为,那么您将不得不使用状态字段来存储它并且在 Effect
中阅读,像这样
public class Imple : choices
{
private int effectNum = 1; // set the default effect here
public void Choose(int index)
{
effectNum = index;
}
public void Effect()
{
switch (effectNum)
{
case 1: // implement the different effects here
break;
case 2:
break;
}
}
}
你想做的是委派。
所以在class实现中,你会创建两个private或者protected方法来实现效果。
然后当您调用 Choose
方法时,它会将您创建的委托引用字段也设置为指向所需的方法。
现在您的 Effect
方法调用委托引用,如果不是 null(已初始化)。
static void Test()
{
var instance = new Imple();
instance.Choose(2);
instance.Effect();
}
public interface choices
{
void Effect();
}
public class Imple : choices
{
private Action SelectedEffect;
public void Effect()
{
if ( SelectedEffect != null ) SelectedEffect();
}
private void Effect1()
{
Console.WriteLine("Effect1 called.");
}
private void Effect2()
{
Console.WriteLine("Effect2 called.");
}
public void Choose(int index)
{
switch ( index )
{
case 1:
SelectedEffect = Effect1;
break;
case 2:
SelectedEffect = Effect2;
break;
default:
throw new NotImplementedException("Effect version n°" + index);
}
}
}
Effect
可以指向来自任何 class:
case 1:
SelectedEffect = SomeReference1.SomeMethod;
break;
case 2:
SelectedEffect = SomeReference2.SomeMethod;
break;
您可以用任何方法签名替换 Action
以匹配参数和任何返回类型。