![](/img/trans.png)
[英]How to call generic method of derived class from base class reference in 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>
您應該在基類中創建一個virtual
或abstract
方法,在每個派生類中重寫它,然后正常調用它。
將您的基類指定為抽象類,在其中編寫方法“ 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.