C#使用基类引用调用派生类属性

时间:2011-10-25 13:17:15

标签: c#

我有一个班级RequestDetail。有两个类classA和classB派生自它,每个类都有自己的属性:

public partial classA : RequestDetail { ..... }
public partial classB : RequestDetail { ..... }

我正在撰写方法CreateMethod1(ClassA a)CreateMethod2(ClassB b)

两种方法都做同样的事情,除了一些细微的差别。我想编写一个泛型方法,并通过在CreateMethod1和CreateMethod2中传递引用来调用该方法。

有人可以帮我这么做吗?

感谢

编辑:

我排除的是我收到了一个WSDL,它在生成时给了我四个独立的类,这些类继承自一个具有大约20个属性的基类。它们只是略有不同,确切地说,2个类包含相同的字段(IsUrgent),第三个包含(Ticket和Reason),第四个包含(BudgetCode)但是对于所有实现而言,持久性完全相同。我不想创建4个单独的方法来保存相同的信息。

值得注意的是,这些课程是部分。

xsd 如下所示

<xs:complexType name="ClassA">
    <xs:complexContent>
      <xs:extension base="IARequestDetails">
        <xs:sequence>
          <xs:element name="IsUrgent" type="IAUrgency"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="ClassB">
    <xs:complexContent>
      <xs:extension base="IARequestDetails">
        <xs:sequence>
          <xs:element name="BudgetCode" type="ProjectBudgetCode"/>
          <xs:element name="IsUrgent" type="IAUrgency"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

5 个答案:

答案 0 :(得分:3)

您应该在基类中创建virtualabstract方法,在每个派生类中重写它,并正常调用它。

答案 1 :(得分:1)

将您的基类指定为抽象,在其中编写方法“CreateMethod”并创建需要不同行为的抽象函数(如果行为重写是可选的,则为虚拟)。覆盖抽象函数,在其中添加所需的行为。

public abstract RequestDetail
{
    public void CreateDetail()
    {
        CustomBehavior();
    }
    protected abstract CustomBehavior();
}
public RequestDetailA : RequestDetail
{
    protected override void CustomBehavior()
    {
        // Foo
    }
}

答案 2 :(得分:1)

如果那些方法在RequestDetails中,我建议你让它接收RequestDetail而在那个方法中,你可以从RequestDetail调用一个抽象方法来做那些微小的差异,每个ClassA和ClassB实现不同的方法,比如

class RequestDetail{
    public void CreateMethod(RequestDetails reqD){ 
        //do what you need
        AbstCreateMethod(reqD);
    }
    public abstract void AbstCreateMethod(RequestDetails reqD);

}

class ClassA : RequestDetails{
    public void AbstCreateMethod(RequestDetails reqD){
        //do classA things  
    }
}

class ClassB : RequestDetails{
    public void AbstCreateMethod(RequestDetails reqD){
        //do classB things  
    }
}

如果它在另一个类中遵循类似的解决方案,但使用具有这些方法的类。 有关此内容的更多信息,请阅读设计模式Template method

答案 3 :(得分:0)

class mybase 
{ 
   virtual void DoStuff(){...}

}

class Der1:mybase
{
    virtual override void DoStuff(){
       base.DoStuff(); // Call the Common Code 
       .... Custom Code for this class
 }

 Der1 A = new Der1(); 
 mybase B = new Der1();
 A.DoStuff(); // this will call the derived version 
 B.DoStuff(); // So will this 

答案 4 :(得分:0)

这是一个使用部分类,接口和泛型约束的解决方案......您需要构建需要在每个子类的Params实现中返回的参数列表,超类属性自然可用。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

namespace ConsoleApplication3
{
    public interface IABInterface
    {
        //Could be your SqlParameters
        string[] Params { get; }
    }

    public partial class IARequestDetails
    {
        public int One
        {
            get; set; 
        }

        public int Two
        {
            get;set;
        }
    }

    public partial class ClassA : IARequestDetails
    {
        public int IsUrgent 
        {
            get;set;
        }
    }

    public partial class ClassB : IARequestDetails
    {
        public int BudgetCode
        {
            get;
            set;
        }

        public int IsUrgent
        {
            get;
            set;
        }
    }

    public partial class ClassA : IABInterface
    {
        #region IABInterface Members

        public string[] Params
        {
            //Create your list of parameters
            get { return null; }
        }

        #endregion
    }

    public partial class ClassB : IABInterface
    {
        #region IABInterface Members

        public string[] Params
        {
            get
            {
                return null;
            }
        }
        #endregion
    }

    public class Persist
    {
        public void Save<T>(T obj)
            where T : IARequestDetails, IABInterface
        {
            //Do you saving here ... 
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Persist persist = new Persist();

            persist.Save(new ClassA());
            persist.Save(new ClassB());
        }
    }
}