正确的语法将基于数据类型的方法分配给继承的抽象方法

时间:2015-04-26 18:06:10

标签: c#

新手问题。假设我有一个带抽象方法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

3 个答案:

答案 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]数据类型的代码