我有一个班级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>
答案 0 :(得分:3)
您应该在基类中创建virtual
或abstract
方法,在每个派生类中重写它,并正常调用它。
答案 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());
}
}
}