联合类似的方法(使用泛型?)

时间:2018-06-11 06:56:28

标签: c# generics

鉴于样本是我挣扎的示范。我需要统一FillBaseClassFillBaseClass方法(DRY)并且不知道如何。我有什么选择?它有可能吗?

public class BaseClass
{
    public BaseClass(int a, int b)
    {
        A = a;
        B = b;
    }

    public void DoSomeCalculation()
    {
        C = A - B;
    }

    public int A { get; set; }
    public int B { get; set; }
    public int C { get; set; }
}

public class DerivedClass : BaseClass
{
    public DerivedClass(int a, int b, int propertyOdDerivedClass) : base(a, b)
    {
        PropertyOfDerivedClass = propertyOdDerivedClass;
    }
    public int PropertyOfDerivedClass { get; set; }
}


public class OtherClass
{
    public void FillBaseClass(List<StorageFile> files, List<BaseClass> listToFill)
    {
        foreach (var file in files)
        {
            var item = new BaseClass(file.Name.Count(), file.Path.Count());// just sample..
            item.DoSomeCalculation();
            listToFill.Add(item);
        }
    }
  //Join these 2 methods together?
    public void FillDerivedClass(List<StorageFile> files, List<DerivedClass> listToFill, int someOtherInt)
    {
        foreach (var file in files)
        {
            var item = new DerivedClass(file.Name.Count(), file.Path.Count(),someOtherInt);// just sample..
            item.DoSomeCalculation();
            listToFill.Add(item);
        }
    }

}

2 个答案:

答案 0 :(得分:1)

您将让消费者接受任何基类或基类子实体。请注意,如果你有2个这样的实体,比如问题中的实体,你需要两个OtherClass实例,一个具有基类提供者,另一个作为派生类。

下面的伪代码: -

    public class ClassHandler<T> where T : BaseClass, new()
{
    public void FillEntity(List<StorageFile> files, List<T> listToFill)
    {
        T obj = null;
        files.ForEach(file =>
        {
            switch (typeof(T).Name)
            {
                case "BaseClass":
                    obj = new BaseClass(file.BaseProp) as T;
                    listToFill.Add(obj);
                    break;
                case "DerievedClass":
                    obj = new DerievedClass(file.BaseProp, file.DerievedProp) as T;
                    listToFill.Add(obj);
                    break;
            };
        });           
    }
}

消费者代码

var base = new OtherClass<BaseClass>();
var derieved = new OtherClass<DerievedClass>();
List<StorageFile> files = GetFilesFromSomewhere();
List<DerievedClass> derievedClasses = new ...
List<BaseClass> baseClasses = new ...
var listOfDerieved = base.FillEntity(files, derievedClasses);
var listOfBase = derieved.FillEntity(files,baseClasses );

答案 1 :(得分:1)

为什么不将第三个参数设为public void FillClass(List<StorageFile> files, List<BaseClass> listToFill, int? someOtherInt = null) { BaseClass item; foreach (var file in files) { if (someOtherInt.HasValue) item = new DerivedClass(file.Name.Count(), file.Path.Count(),someOtherInt.Value); else item = new BaseClass(file.Name.Count(), file.Path.Count()); item.DoSomeCalculation(); listToFill.Add(item); } } 并根据其值创建正确的实例?

所以我会简单地做下面的事情:

null

请注意,第三个参数的默认值为FillClass,因此您可以在不提供的情况下致电bind(RecvSocket, (SOCKADDR *) &RecvAddr, sizeof(RecvAddr)); recvfrom(RecvSocket,RecvBuf, 5, 0,(SOCKADDR *)&SenderAddr,&SenderAddrSize); ... int i=sendto(RecvSocket,SendBuf,strlen(SendBuf)+1,0,(SOCKADDR *) &RecvAddr,sizeof(RecvAddr));