-1

両方に同様のコードを持つ2つのクラスがありますが、変数は異なります

ISource.cs

public interface ISource
{
    string AvailConfigPath { get; }

    string AvailVersion { get; }

    IDictionary<string, string> AvailFiles { get; }
}

public class Source : ISource
{
    public string AvailConfigPath
    {
        get
        {
            return @"D:\Mindful\Visual Studio 2012\Projects\AutoUpdator\AutoUpdator\Source\AvailInfoFile.config";
        }
    }

    private XDocument document = XDocument.Load(@"D:\Mindful\Visual Studio 2012\Projects\AutoUpdator\AutoUpdator\Source\AvailInfoFile.config");

    public string AvailVersion
    {
        get
        {
            return document.Root
                         .Element("InfoConfigFile")
                         .Attribute("version").Value.ToString();
        }
    }

    public IDictionary<string, string> AvailFiles
    {
        get
        {
            return document.Root
                         .Element("files")
                         .Elements("file")
                         .ToDictionary(x => x.Attribute("name").Value,
                                       x => x.Attribute("version").Value);
        }
    }
}

ITarget.cs

   public interface ITarget
{
    string LocalConfigPath { get; }

    string LocalVersion { get; }

    IDictionary<string, string> LocalFiles { get; }
}

internal class Target : ITarget
{
    public string LocalConfigPath
    {
        get
        {
            return @"D:\Mindful\Visual Studio 2012\Projects\AutoUpdator\AutoUpdator\Target\LocalInfoFile.config";
        }
    }

    private XDocument document = XDocument.Load(@"D:\Mindful\Visual Studio 2012\Projects\AutoUpdator\AutoUpdator\Target\LocalInfoFile.config");

    public string LocalVersion
    {
        get
        {
            return document.Root
                     .Element("InfoConfigFile")
                     .Attribute("version").Value;
        }
    }

    public IDictionary<string, string> LocalFiles
    {
        get
        {
            return document.Root
                     .Element("files")
                     .Elements("file")
                     .ToDictionary(x => x.Attribute("name").Value,
                                   x => x.Attribute("version").Value);
        }
    }
}

今、私は抽象クラスを作成し、共通のコードをそのクラス ファイルに入れ、そのコードをこれら両方のクラス ファイルに継承したいと考えています。

4

2 に答える 2

3

この方法でそれらを組み合わせることができるはずです:

public interface ITarget
{
    string LocalConfigPath { get; }
    string LocalVersion { get; }
    IDictionary<string, string> LocalFiles { get; }
}

public interface ISource
{
    string AvailConfigPath { get; }
    string AvailVersion { get; }
    IDictionary<string, string> AvailFiles { get; }
}

internal abstract class BaseClass
{
    public virtual string ConfigPath { get; }
    private XDocument document = XDocument.Load(ConfigPath);

    public string Version
    {
        get
        {
            return document.Root
                     .Element("InfoConfigFile")
                     .Attribute("version").Value;
        }
    }

    public IDictionary<string, string> Files
    {
        get
        {
            return document.Root
                     .Element("files")
                     .Elements("file")
                     .ToDictionary(x => x.Attribute("name").Value,
                                   x => x.Attribute("version").Value);
        }
    }
}

internal class Target : BaseClass, ITarget
{
    public override string LocalConfigPath
    {
        get
        {
            return @"D:\Mindful\Visual Studio 2012\Projects\AutoUpdator\AutoUpdator\Target\LocalInfoFile.config";
        }
    }

    public string LocalVersion
    {
        get { return Version; }
    }

    public IDictionary<string, string> LocalFiles
    {
        get { return Files; }
    }
}

public class Source : BaseClass, ISource
{
    public override string AvailConfigPath
    {
        get
        { return @"D:\Mindful\Visual Studio 2012\Projects\AutoUpdator\AutoUpdator\Source\AvailInfoFile.config"; }
    }

    public string AvailVersion
    {
        get { return Version; }
    }

    public IDictionary<string, string> AvailFiles
    {
        get { return Files; }
    }
}

注: クラス名は使用しないでくださいBaseClass。よりドメインに適した名前にしてください。私はそれが「基本クラス」であることを説明するためにそれを使用していました

Sourceまた、公開されている場合は、公開する必要があることにも注意してくださいBaseClass本当にBaseClassを内部でベイクしたい場合は、継承の代わりにカプセル化を使用できます。これはまだコードを再利用していますが、配管は異なります。

于 2013-06-19T13:59:25.807 に答える
0

D Stanley__に感謝します__あなたの答えは、この問題を解決するのに大いに役立ちました

AbstractClass.cs

public abstract class BaseClass
{

    private string _ConfigPath;

    public string ConfigPath
    {
        get { return _ConfigPath; }
        set { _ConfigPath = value; }
    }


    private XDocument _Document = null;

    private XDocument document
    {
        get
        {
            if (_Document == null)
                _Document = XDocument.Load(ConfigPath);

            return _Document;
        }
    }

    public string Version
    {
        get
        {
            return document.Root
                     .Element("InfoConfigFile")
                     .Attribute("version").Value;
        }
    }

    public IDictionary<string, string> Files
    {
        get
        {
            return document.Root
                     .Element("files")
                     .Elements("file")
                     .ToDictionary(x => x.Attribute("name").Value,
                                   x => x.Attribute("version").Value);
        }
    }
}



ISource.cs

 public interface ISource
{
    string ConfigPath { get; }

    string AvailVersion { get; }

    IDictionary<string, string> AvailFiles { get; }
}
public class Source : BaseClass, ISource
{
    public Source()
    {
        ConfigPath = @"D:\Mindful\Visual Studio 2012\Projects\AutoUpdator\AutoUpdator\Source\AvailInfoFile.config";
    }


    public string AvailVersion
    {
        get
        {
            return Version;
        }
    }

    public IDictionary<string, string> AvailFiles
    {
        get
        {
            return Files;
        }
    }
}



ITarget.cs

public interface ITarget
{
    string ConfigPath { get; }

    string LocalVersion { get; }

    IDictionary<string, string> LocalFiles { get; }
}

internal class Target : BaseClass, ITarget
{
    public Target()
    {
        ConfigPath = @"D:\Mindful\Visual Studio 2012\Projects\AutoUpdator\AutoUpdator\Target\LocalInfoFile.config";
    }
    public string LocalVersion
    {
        get
        {
            return Version;
        }
    }

    public IDictionary<string, string> LocalFiles
    {
        get
        {
            return Files;
        }
    }
}
于 2013-06-20T03:04:04.530 に答える