簡體   English   中英

C#使用基類引用調用派生類屬性

[英]C# call derived class property using base class reference

我有一個類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>

您應該在基類中創建一個virtualabstract方法,在每個派生類中重寫它,然后正常調用它。

將您的基類指定為抽象類,在其中編寫方法“ CreateMethod”,並在需要不同行為的情況下創建抽象函數(如果行為替代是可選的,則創建虛擬函數)。 覆蓋抽象函數,在其中添加所需的行為。

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

如果這些方法在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方法

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 

這是一個使用部分類,接口和通用約束的解決方案...您將需要為每個子類建立在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());
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM