新手问题。假设我有一个带抽象方法Edit()的抽象类A.需要根据数据类型覆盖编辑。它在A类中是通用的。
public abstract class A
{
.....
public abstract void Edit();
....
}
现在,类B实现了类A,但是根据数据类型具有不同的构造函数。因此构造函数#1执行Edit_1(),构造函数#2执行Edit_2()。
所以我想写下B类的东西:
public class B : A
{
public B(dataType1): base()
{
this.Edit = Edit_1;
}
public B(dataType2): base()
{
this.Edit = Edit_2;
}
void Edit_1() {....}
void Edit_2() {....}
}
可以这样做吗?这样做的正确语法是什么?还有更好的方法吗?
TIA
答案 0 :(得分:3)
听起来你正试图用你真正应该使用组合来解决继承问题 - 在你的构造函数中添加一个参数,该参数注入一个实现IEditable
的类型的实例,该实例具有Edit
接受类型为A
的实例的方法。
public abstract class A
{
}
public interface IEditable
{
public void Edit(A myInstance);
}
public class B : A
{
private IEditable _editor;
public B(IEditable editor)
{
_editor = editor;
}
}
答案 1 :(得分:1)
您描述的行为听起来可能更适合于接口或泛型类。根据数据类型,单个类实现不同的行为通常表示滥用多态。
尽管如此,这可以通过委托来完成:
public class B : A
{
private Action editFunction;
public B(string foo)
: base()
{
editFunction = Edit_1;
}
public B(int bar)
: base()
{
editFunction = Edit_2;
}
public override void Edit()
{
editFunction();
}
void Edit_1() { }
void Edit_2() { }
}
答案 2 :(得分:0)
我真的不明白你种植我们的问题。
但是您可以执行以下操作,我认为this.Edit
是一个事件,并且您正在尝试根据构造函数中的数据类型设置委托。
所以只写一个构造函数并说:
public B(Object Obj)
: base()
{
swich (Obj.GetType())
{
Case DataType1:
this.Edit = Edit_1;
break;
Case DataType2:
this.Edit = Edit_2;
default:
throw new Exception("Object Type [" + Obj.GetType().FullName + "] not supported");
}
}
如果这不能解决您的问题,请尝试更好地解释,我会找到更好的解决方案。
更新:回复评论
因此,您应该使用标记为答案的帖子,但[A]必须是IEditable,并且必须包含名为Edit的方法。那么你的B类必须实现[A],你将在每个[B] Edit方法中编写不同的代码部分。然后当你像这样说[B]:
A是包含Edit方法的IEditable。
public class B : A {....}
IEditable Interface = new B;
[B]可以是任何实现[A] IEditable的类。
调用Interface.Edit
并执行此[B]数据类型的代码